首页 > 代码库 > ListView多选删除功能实现。
ListView多选删除功能实现。
主体思想,把要删除的位置放入List中进行保存,之后根据list进行删除。
实现了全选,反选删除功能。
MainActivity
public class MainActivity extends Activity { ListView show; List<String> datas = new ArrayList<String>(); ListAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); show = (ListView)findViewById(R.id.showList); //ListView刷新数据 refresh(); } private void refresh() { datas.clear(); for(int i = 0; i < 30; i++) { datas.add("数据" + i); } adapter = new ListAdapter(this,datas); show.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { //重新加载数据 case R.id.action_settings: refresh(); break; //删除数据 case R.id.action_delete: adapter.update(); break; //全选 case R.id.action_selectAll: adapter.selectAll(); break; //反选 case R.id.action_invert: adapter.invert(); break; } return true; }
自定义adapter之ListAdapter
public class ListAdapter extends BaseAdapter { LayoutInflater inflater; List<String> AdapterDatas; List<Integer> checkState; public ListAdapter(Context context,List<String> datas) { inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); AdapterDatas = datas; checkState = new ArrayList<Integer>(); } @Override public int getCount() { return AdapterDatas.size(); } @Override public Object getItem(int position) { return AdapterDatas.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { Holder holder = new Holder(); if(convertView == null) { convertView = inflater.inflate(R.layout.main_item, null); holder.tv = (TextView)convertView.findViewById(R.id.item_title); holder.check = (CheckBox)convertView.findViewById(R.id.check); convertView.setTag(holder); System.out.println("新的View的位置是:" + position); } else { holder = (Holder) convertView.getTag(); System.out.println("旧的View的位置是:" + position); } holder.tv.setText(AdapterDatas.get(position)); if(checkState.contains(position)) { holder.check.setChecked(true); } else { holder.check.setChecked(false); } holder.check.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { CheckBox check = (CheckBox)v; if(check.isChecked()) { checkState.add(position); } else { checkState.remove((Integer)position); } } }); convertView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(inflater.getContext(), "" + position, Toast.LENGTH_SHORT).show(); } }); return convertView; } //删除选择项 public void update() { //根据位置删除list中元素时,由于删除一个元素后面的元素的 //位置也相应的改变,所以先进行排序,从list后面开始删除 Collections.sort(checkState); for(int i = checkState.size()-1 ;i >= 0;i--) { AdapterDatas.remove((int)checkState.get(i)); } checkState.clear(); notifyDataSetChanged(); } //选择全部 public void selectAll() { checkState.clear(); for(int i = 0;i < AdapterDatas.size();i++) { checkState.add((Integer)i); } notifyDataSetChanged(); } //反选 public void invert() { for(int i = 0;i < AdapterDatas.size();i++) { if(checkState.contains((Integer)i)) { checkState.remove((Integer)i); } else { checkState.add((Integer)i); } } notifyDataSetChanged(); } public class Holder { TextView tv; CheckBox check; } }一个卡了挺久的问题:
本来列表项中的checkBox的事件是setOnCheckedChangeListener这个事件由checkBox的点击状态改变触发。
逻辑上是没有问题的。关键是每当隐藏一个列表项时,就会触发这个方法(可能是android的默认机制的原因吧),
从而无缘无故的执行setOnCheckedChangeListener事件中的语句,导致了错误的结果。
无奈只有改变了触发事件改成了setOnClickListener这种单击的模式。
ListView多选删除功能实现。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。