今天在仿制一个应用的时候,发现我不会实现listView的长按进入多选这个功能,就找了一下资料。。发现找资料用去的时间还是蛮多的。。。天。理解完之后,自己写了一份代码。
简单来说,就是实施对ListView中item的长按监控,对CheckBox的显示与隐藏进行操作而已。好像有一个ListView中有一个setChoseMode方法。。不太清楚怎么用的,等下我再看看研究研究,应该会更简便。本编例子只显示一个基本的想法,详细实现---略。欢迎交流。
simple_item_listview.xml代码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/simple_item_tv" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <CheckBox android:id="@+id/simple_item_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:visibility="gone" /> </LinearLayout>
主代码:
public class MainActivity extends ActionBarActivity implements OnItemLongClickListener,OnClickListener{ private ListView mListView; private Button mDelBt; private BaseAdapter mBaseAdapter; private static final int CHOICE_MODE = 1; //多选模式的标识 private static final int DELETE_BUTTON_ID = 1; //删除button的id private int mode = 0; //当前模式的标识 final String[] data = new String[]{"i","like","android"};//本例只做简单示范,不对数据进行删除操作。 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView = (ListView)findViewById(R.id.listview); mListView.setOnItemLongClickListener(this); initAdapter(); //初始化adapter mListView.setAdapter(mBaseAdapter); } /** * 初始化adapter。为方便大家看,这里就不继承重写BaseAdapter类了。 */ private void initAdapter() { mBaseAdapter = new BaseAdapter() { @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null){ convertView = getLayoutInflater().inflate(R.layout.simple_item_listview, null); } TextView tv = (TextView) convertView.findViewById(R.id.simple_item_tv); tv.setText(data[position]); CheckBox cb = (CheckBox) convertView.findViewById(R.id.simple_item_cb); if(mode==CHOICE_MODE){ cb.setVisibility(View.VISIBLE); }else{ cb.setVisibility(View.GONE); } return convertView; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return data[position]; } @Override public int getCount() { return data.length; } }; } /* * 监控listview的长按事件,当长按时更改视图,显示checkbox,让用户对 * 其进行多选。 */ @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { mode = CHOICE_MODE; ((CheckBox)view.findViewById(R.id.simple_item_cb)).setChecked(true); //选中被长按的item mBaseAdapter.notifyDataSetChanged(); showDeleteButton(); return false; } /** * 展示删除按钮 */ private void showDeleteButton() { android.widget.AbsListView.LayoutParams params = new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); mDelBt = new Button(this); mDelBt.setId(DELETE_BUTTON_ID); mDelBt.setLayoutParams(params); mDelBt.setText("删除"); mDelBt.setOnClickListener(this); mListView.addFooterView(mDelBt); } @Override public void onClick(View v) { switch (v.getId()) { case DELETE_BUTTON_ID: //删除操作方法在这里,里面首先要获取哪些被选中,才能对其进行操作。 delete(); mListView.removeFooterView(mDelBt); //隐藏删除button mode = 0; //还原为非多选模式,隐藏checkbox mBaseAdapter.notifyDataSetChanged(); <span style="white-space:pre"> </span>//更新视图 break; default: break; } } /** * 删除item方法 */ private void delete() { //可以是遍历哪个被check了,然后对其进行操作,数据方面需要有一个保存是否check的变量。本例为简便没有设置。 }
不用ChoiceMode实现ListView的长按进入多选删除模式。
原文地址:http://blog.csdn.net/zuolovefu/article/details/43312549