今天在仿制一个应用的时候,发现我不会实现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>
activity的xml只有一个listView
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的变量。本例为简便没有设置。
昨晚看到了一个actionMode的长按显示删除方法,觉得很好用,兼容到2.1版本的,也比较美观,比这个在listView底下添加视图好看多了!!具体方法的文章:Android新的menu实现——ActionMode
同时注意在那篇文章的设置中,
切记要在onDestoryActionMode方法里把actionMode设置为null,因为当调用actionMode.finish()方法的时候会调用这个方法,需要把我们的actionMode变量重新设置为null,以帮助在使用时检验是否已经开启了actionMode模式,从而判断是否进入actionMode模式。
今天在仿制一个应用的时候,发现我不会实现listView的长按进入多选这个功能,就找了一下资料。。发现找资料用去的时间还是蛮多的。。。天。理解完之后,自己写了一份代码。 简单来说,就是实施对ListView中item的长按监控,对CheckBox的显示与隐藏进行操作而已。好像有一个ListView中有一个setChoseMode方法。。不太清楚怎么用的,等下我再看看研究研究,应该会
getApplicationContext(),
mlistItem,// 数据源
R.layout.listviewitem, new String[] { "mtext", "mtime" },
new int[] { R.id.ItemText,
使用ArrayList动态数组的依赖性实现动态增减Spinner下拉菜单选项功能。
设置一个EditText输入框,当用户输入了文字并单击【添加】按钮的同时,就会将输入的值添加Spinner至下拉菜单的最后一项,接着Spinner会停留在刚刚添加的选项上,单击【删除】按钮则会删除选择的Spinner选项。
运行截图:
AS中的设计视图如下,
接着是checkbox_item.xml,这个用的是相对布局,个人感觉还是这个相对整齐的排列还是喜欢用相对布局。这个布局文件描述的是每个ListView的选项,同时每个选项都包括一个ImageView和TextView,分别用来显示每个项前面的图片以及后面的文本,这个也可以根据需求自定义。
<?xml version="1.0" encoding="utf-8"?>.
首先,在为
ListView添加数据,设置适配器。
其次,为
listview注册上下文菜单。
最后,在重写的上下文菜单的onCreateContextMenu方法中去获取当
长按
ListView的时候对应item的positon
在onContextItemSelected()方法中去移除数据,刷新
listview。
大概就是这样,下面给出代码。
一、布局文件 main_layout
在实际开发中有好多多选删除的使用场景,我们现在遇到的是,listview 里边是一个 BaseAdapter 出来的列表
简单分析下,大概是需要这样操作,首先 listview的 item项里要有一个 多选框 这个多选框 默认是隐藏的。
一般情况下 点击是要进入详情页面。然后长按的话进入多选删除操作。所以我们这里要设定两个事件 分别为:
OnClickListener 和 OnLong...