android listview滑动删除
16lz
2021-01-24
本例满足一些开发者为了实现像iphone中list选项的滑动删除功能,在android中没有现成的控件可以实现这个功能,所以研究了下在自定义的适配类中为每个项的contentview设置触控监听OnTouchListener实现,具体实现步骤如下。
第一步:设计main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:divider="@null" /></RelativeLayout>
第二步:设计item.xml添加一个TextView和一个Button如下:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/contact_listitem" android:orientation="horizontal" android:gravity="center_vertical" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:layout_gravity="center_vertical" android:paddingTop="8dip" android:paddingLeft="8dip" android:paddingBottom="8dip" android:singleLine="true" android:text="hhhh" android:layout_margin="8dip" /> <Button android:id="@+id/del" android:layout_width="wrap_content" android:singleLine="true" android:layout_height="wrap_content" android:gravity="center_vertical" android:layout_gravity="center_vertical" android:layout_alignParentRight="true" android:paddingLeft="8dip" android:paddingRight="8dip" android:textColor="#ffffff" android:background="@drawable/btn_style_six_normal" android:text="删除" android:layout_margin="8dip" android:visibility="gone" /></RelativeLayout>
第三步:创建设配类MyAdapter继承BaseAdapter在本类中主要是对触控滑动显示删除按钮做了比较详细,其他的跟一般的listview设计大同小异,代码如下:
import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnTouchListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.TextView;public class MyAdapter extends BaseAdapter {private List<String> arrays = null;private Context mContext;private Button curDel_btn;private float x,ux;public MyAdapter(Context mContext, List<String> arrays) {this.mContext = mContext;this.arrays = arrays;}public int getCount() {return this.arrays.size();}public Object getItem(int position) {return null;}public long getItemId(int position) {return position;}public View getView(final int position, View view, ViewGroup arg2) {ViewHolder viewHolder = null;if (view == null) {viewHolder = new ViewHolder();view = LayoutInflater.from(mContext).inflate(R.layout.item, null);viewHolder.tvTitle = (TextView) view.findViewById(R.id.title);viewHolder.btnDel = (Button) view.findViewById(R.id.del);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}//为每一个view项设置触控监听view.setOnTouchListener(new OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {final ViewHolder holder = (ViewHolder) v.getTag();//当按下时处理if (event.getAction() == MotionEvent.ACTION_DOWN) {//设置背景为选中状态v.setBackgroundResource(R.drawable.mm_listitem_pressed);//获取按下时的x轴坐标x = event.getX();//判断之前是否出现了删除按钮如果存在就隐藏if (curDel_btn != null) {curDel_btn.setVisibility(View.GONE);}} else if (event.getAction() == MotionEvent.ACTION_UP) {// 松开处理//设置背景为未选中正常状态v.setBackgroundResource(R.drawable.mm_listitem_simple);//获取松开时的x坐标ux = event.getX();//判断当前项中按钮控件不为空时if (holder.btnDel != null) {//按下和松开绝对值差当大于20时显示删除按钮,否则不显示if (Math.abs(x - ux) > 20) {holder.btnDel.setVisibility(View.VISIBLE);curDel_btn = holder.btnDel;}}} else if (event.getAction() == MotionEvent.ACTION_MOVE) {//当滑动时背景为选中状态v.setBackgroundResource(R.drawable.mm_listitem_pressed);} else {//其他模式//设置背景为未选中正常状态v.setBackgroundResource(R.drawable.mm_listitem_simple);}return true;}});viewHolder.tvTitle.setText(this.arrays.get(position));//为删除按钮添加监听事件,实现点击删除按钮时删除该项viewHolder.btnDel.setOnClickListener(new OnClickListener() {public void onClick(View v) {if(curDel_btn!=null)curDel_btn.setVisibility(View.GONE);arrays.remove(position);notifyDataSetChanged();}});return view;}final static class ViewHolder {TextView tvTitle;Button btnDel;}}
第四步:编写MainActivity这里比较简单,不多说直接贴代码
import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;public class MainActivity extends Activity {private ListView mListView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView) this.findViewById(R.id.list); List<String> list = new ArrayList<String>(); for(int i=0;i<10;i++){ list.add("选项"+i); } //实例化自定义内容适配类 MyAdapter adapter = new MyAdapter(this,list); //为listView设置适配 mListView.setAdapter(adapter); } }
第五步:运行效果如图:
更多相关文章
- Android官方架构组件介绍之LifeCycle
- Android(安卓)组件系列 -- Activity 启动流程(9.0)
- Android(安卓)Wifi 的电源管理
- AndroidStudio实现按钮按下时状态改变以及选择器属性及基本用法
- StatusBar (状态栏)的架构(Android(安卓)2.3)
- Android(安卓)Gems — Fragment本质之View管理
- .Net 转战 Android(安卓)4.4 日常笔记(4)--按钮事件和国际化
- Edittext失去焦点
- Android(安卓)ApiDemos示例解析(189):Views->ScrollBars->2.Fanc