ListView 和CheckBox的批量删除问题的解决。

转发地址:http://bbs.9ria.com/thread-223817-1-1.html

这个问题困扰了我好久好久,看到下面这篇文章。我真是高兴激动,终于解决了批量删除的问题。感谢原文作者。

主要在下面红色代码:

  1. DataItem.java

  2. package com.example.checkboxdemo;

  3. public class DataItem {

  4.     private String title;

  5.     private boolean flag;

  6.     public String getTitle() {

  7.         return title;

  8.     }

  9.     public void setTitle(String title) {

  10.         this.title = title;

  11.     }

  12.     public boolean getFlag() {

  13.         return flag;

  14.     }

  15.     public void setFlag(boolean flag) {

  16.         this.flag = flag;

  17.     }



  18. MyAdapter.java

  19. package com.example.checkboxdemo;

  20. import java.util.ArrayList;

  21. import java.util.HashMap;



  22. import android.content.Context;

  23. import android.view.LayoutInflater;

  24. import android.view.View;

  25. import android.view.ViewGroup;

  26. import android.widget.BaseAdapter;

  27. import android.widget.CheckBox;

  28. import android.widget.TextView;



  29. import com.example.checkboxdemo.MainActivity.ViewHolder;



  30. public class MyAdapter extends BaseAdapter {

  31.     public ArrayList mVideoList;

  32.     private Context context;

  33.     private LayoutInflater mInflater = null;



  34.      

  35.     public MyAdapter(Context context, ArrayList list)

  36.     {

  37.         this.context = context;

  38.         this.mVideoList = list;

  39.         mInflater = LayoutInflater.from(context);

  40.     }

  41.      

  42.     @Override

  43.     public int getCount() {

  44.         return mVideoList.size();

  45.     }



  46.     @Override

  47.     public Object getItem(int position) {

  48.         return mVideoList.get(position);

  49.     }



  50.     @Override

  51.     public long getItemId(int position) {

  52.         return position;

  53.     }



  54.     @Override

  55.     public View getView(int position, View convertView, ViewGroup parent) {

  56.         ViewHolder mHolder = null;

  57.         if(null == convertView)

  58.         {

  59.             mHolder = new ViewHolder();

  60.             convertView = mInflater.inflate(R.layout.test_item, null);

  61.             mHolder.mTitle = (TextView)convertView.findViewById(R.id.item_tv);

  62.             mHolder.mCheck = (CheckBox)convertView.findViewById(R.id.item_cb);

  63.             convertView.setTag(mHolder);

  64.         }else

  65.         {

  66.             mHolder = (ViewHolder)convertView.getTag();

  67.         }

  68.         mHolder.mTitle.setText(mVideoList.get(position).getTitle());

  69.         mHolder.mCheck.setChecked(mVideoList.get(position).getFlag());

  70.          

  71.         return convertView;

  72.     }






  73. MainActivity.java



  74. package com.example.checkboxdemo;



  75. import java.util.ArrayList;

  76. import java.util.HashMap;



  77. import android.app.Activity;

  78. import android.os.Bundle;

  79. import android.view.View;

  80. import android.view.View.OnClickListener;

  81. import android.widget.AdapterView;

  82. import android.widget.AdapterView.OnItemClickListener;

  83. import android.widget.Button;

  84. import android.widget.CheckBox;

  85. import android.widget.ListView;

  86. import android.widget.TextView;

  87. import android.widget.Toast;



  88. public class MainActivity extends Activity {

  89.     private ListView mVideoView;

  90.     private MyAdapter mAdapter;

  91.     private ArrayList mVideoList;

  92.     private Button mCheckAllBtn;

  93.     private Button mUnCheckAllBtn;

  94.     private Button mCancelBtn;

  95.     private Button mDeleteItemBtn;

  96.     String str[] = {"item0","item1","item2","item3","item4","item5","item6",

  97.             "item7","item8","item9","item10","item11","item12"};

  98.     @Override

  99.     protected void onCreate(Bundle savedInstanceState) {

  100.         super.onCreate(savedInstanceState);

  101.         setContentView(R.layout.activity_main);

  102.         initViews();

  103.         initListeners();

  104.     }

  105.      

  106.     private void initViews()

  107.     {

  108.         mVideoView = (ListView)findViewById(R.id.lv);

  109.         mCheckAllBtn = (Button)findViewById(R.id.checkAll);

  110.         mUnCheckAllBtn = (Button)findViewById(R.id.uncheckAll);

  111.         mCancelBtn = (Button)findViewById(R.id.cancelCheck);

  112.         mDeleteItemBtn = (Button)findViewById(R.id.deleteItem);

  113.         mVideoList = new ArrayList();

  114.         initData();

  115.     }

  116.      

  117.     private void initData()

  118.     {

  119.         for(int i = 0; i < str.length; i++)

  120.         {

  121.             DataItem item = new DataItem();

  122.             item.setTitle(str[i]);

  123.             item.setFlag(false);

  124.             mVideoList.add(item);

  125.         }

  126.         mAdapter = new MyAdapter(this, mVideoList);

  127.         mVideoView.setAdapter(mAdapter);

  128.     }

  129.      

  130.     private void initListeners()

  131.     {

  132.         mCheckAllBtn.setOnClickListener(new OnClickListener() {

  133.              

  134.             @Override

  135.             public void onClick(View v) {

  136.                 for(int i = 0; i < mVideoList.size(); i++)

  137.                 {

  138.                     mVideoList.get(i).setFlag(true);

  139.                 }

  140.                 mAdapter.notifyDataSetChanged();

  141.             }

  142.         });

  143.          

  144.         mUnCheckAllBtn.setOnClickListener(new OnClickListener() {

  145.              

  146.             @Override

  147.             public void onClick(View v) {

  148.                 for(int i = 0; i < mVideoList.size(); i++)

  149.                 {

  150.                     mVideoList.get(i).setFlag(false);

  151.                 }

  152.                 mAdapter.notifyDataSetChanged();

  153.             }

  154.         });



  155.         mCancelBtn.setOnClickListener(new OnClickListener() {

  156.              

  157.             @Override

  158.             public void onClick(View v) {

  159.                 for(int i = 0; i < mVideoList.size(); i++)

  160.                 {

  161.                     if(mVideoList.get(i).getFlag())

  162.                     {

  163.                         mVideoList.get(i).setFlag(false);

  164.                     }else

  165.                     {

  166.                         mVideoList.get(i).setFlag(true);

  167.                     }

  168.                 }

  169.                 mAdapter.notifyDataSetChanged();

  170.             }

  171.         });

  172.          

  173.         mDeleteItemBtn.setOnClickListener(new OnClickListener() {

  174.              

  175.             @Override

  176.             public void onClick(View v) {

  177.                 /**

  178.                  * 这里不能直接操作mVideoList,需要缓存到一个列表中一起清除,否则会出现错误

  179.                  */

  180.                 ArrayList deleteList = new ArrayList();

  181.                 for(int i = 0; i < mVideoList.size(); i++)

  182.                 {

  183.                     if(mVideoList.get(i).getFlag())

  184.                     {

  185.                         deleteList.add(mVideoList.get(i));

  186.                     }

  187.                 }

  188.                 mVideoList.removeAll(deleteList);

  189.                 deleteList.clear();

  190.                 mAdapter.notifyDataSetChanged();

  191.             }

  192.         });

  193.          

  194.         mVideoView.setOnItemClickListener(new OnItemClickListener() {



  195.             @Override

  196.             public void onItemClick(AdapterView parent, View view, int position,

  197.                     long id) {

  198.                 ViewHolder holder = (ViewHolder)view.getTag();

  199.                 //改变CheckBox状态

  200.                 holder.mCheck.toggle();

  201.                 mAdapter.mVideoList.get(position).setFlag(holder.mCheck.isChecked());

  202.             }

  203.         });

  204.     }



  205.     static class ViewHolder

  206.     {

  207.         public TextView mTitle;

  208.         public CheckBox mCheck;

  209.     }


  210. }
复制代码

这里需要注意下面的item的CheckBox定义,如果不加上红色的三行代码,会导致onItemClickListener失效
test_item.xml

  1.     android:layout_width="match_parent"

  2.     android:layout_height="wrap_content"

  3.     android:gravity="center_vertical"

  4.     android:orientation="horizontal" >

  5.      

  6.    

  7.         android:id="@+id/item_tv"

  8.         android:layout_width="0dip"

  9.         android:layout_height="wrap_content"

  10.         android:layout_marginLeft="20dp"

  11.         android:layout_weight="1"

  12.         android:gravity="center_vertical"

  13.         />

  14.    

  15.         android:id="@+id/item_cb"

  16.         android:layout_width="wrap_content"

  17.         android:layout_height="wrap_content"

  18. [b]    [color=#ff00]    android:clickable="false"

  19.         android:focusable="false"

  20.         android:focusableInTouchMode="false"[/color][/b]

  21.         android:gravity="center_vertical"

  22.         />

你可能感兴趣的:(Android)