今天在仿制一个应用的时候,发现我不会实现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