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这种单击的模式。

 

0 0