解決列表 (ListView GrifView RecyclerView )結合CheckBox實現列表選擇的的問題
阿新 • • 發佈:2019-01-28
</pre><pre code_snippet_id="1651469" snippet_file_name="blog_20160418_2_235831" name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 實現思路:由於列表類都是需要重複使用Item佈局,所以這裡不要監聽CheckBox的CheckChange事件,不然問題會變得很複雜。只需要監聽列表的單擊事件,把點選事件</span>
繞過CheckBox傳遞到Item,步驟1、2的設定就是起到這種效果。CheckBox只是起到顯示的作用,它的Check改變監聽事件這裡不會用到。接著通過監聽Item的單擊事件設定CheckBox是否選中,用setChecked
1、確保Item的佈局有新增這個屬性
android:descendantFocusability="blocksDescendants"
2、確保CheckBox新增這個屬性
android:clickable="false"
3、處理Item的單擊事件
(1)RecyclerView處理方式
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { CheckBox cbTab; View view; public ViewHolder(View itemView, int viewType) { super(itemView); this.view = itemView; cbTab = (CheckBox) itemView.findViewById(R.id.cb_tab); view.setOnClickListener(this); } @Override public void onClick(View view) { int position=getAdapterPosition(); if (mTagList.get(position).isChecked()) { mTagList.get(position).setChecked(false); cbTab.setChecked(false); } else { mTagList.get(position).setChecked(true); cbTab.setChecked(true); } } }
(2)ListView或GridView的處理方式
gvTag.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { CheckBox cbTab= (CheckBox) view.findViewById(R.id.cb_tab); if (mTagList.get(i).isChecked()) { mTagList.get(i).setChecked(false); cbTab.setChecked(false); } else { mTagList.get(i).setChecked(true); cbTab.setChecked(true); } } });