本人第一次写博客,希望各位看官不要笑话,这里介绍了一个ListView中CheckBox复用问题的解决方案,如本人代码表写有问题,希望各位可以及时指正哦,谢谢~
首先是MainActivity中的代码
public class MainActivity extends AppCompatActivity { private ListView mLv; List mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initdata(); //设置adapter mLv.setAdapter(new LvAdapter(this,mDatas)); } private void initdata() { mDatas = new ArrayList(); for (int i=0;i<100;i++){ mDatas.add(i); } } private void initView() { mLv = (ListView) findViewById(R.id.lv); } }MainActivity中布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.com.checkboxlistview.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>Adapter中的代码
public class LvAdapter extends BaseAdapter { private static final String TAG = "LvAdapter"; private final Context mContext; private final List mDatas; ArrayList<Bean> list; public LvAdapter(Context context, List datas) { mContext = context; mDatas = datas; //创建一个list去保存bean,bean里面保存了CheckBox的状态 list = new ArrayList<Bean>(); } @Override public int getCount() { return mDatas.size(); } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if(convertView == null){ convertView = LayoutInflater.from(mContext).inflate(R.layout.item_lv,null); holder = new ViewHolder(); holder.cb = (CheckBox) convertView.findViewById(R.id.cb); holder.tv = (TextView) convertView.findViewById(R.id.tv); convertView.setTag(holder); }else{ holder = (ViewHolder)convertView.getTag(); } holder.tv.setText(mDatas.get(position) + ""); //创建出来的bean,根据每个position保存了每个position里面的checkBox的状态 Bean bean = new Bean(); list.add(bean); // 解决CheckBox的复用问题 holder.cb.setOnClickListener(new View.OnClickListener() {// 设置checkBox点击事件 @Override public void onClick(View v) { // 判断checkBox的勾选状态,并保存到bean中 if (holder.cb.isChecked()) { // 手动保存每个checkBox的勾选状态 list.get(position).setCheck(true); } else { // 手动保存每个checkBox的勾选状态 list.get(position).setCheck(false); } } }); Bean states = list.get(position); // 重新取出checkBox的勾选状态并设置 holder.cb.setChecked(states.isCheck()); return convertView; } @Override public Object getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } class ViewHolder{ CheckBox cb; TextView tv; } }ListView中item的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/tv" android:layout_marginLeft="15dp" android:gravity="center" android:textSize="18sp" android:textColor="#ff0000" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="11"/> </LinearLayout>
用来保存CheckBox状态的bean
public class Bean { private static final String TAG = "Bean"; private boolean checked; public boolean isCheck() { return checked; } public void setCheck(boolean checked) { this.checked = checked; } }