2017-09-15 70 views
0

我使用文本框和複選框創建了列表視圖。首先我保留所有項目都是Checked默認。複選框在Android中滾動列表視圖時選中或未選中

但是,當我取消選中複選框並向下滾動以取消選中列表視圖中的其他項目時,會檢查較舊的項目。請幫我用我的代碼。

這是我的適配器類的代碼。

@Override 
public View getView(final int position, View convertView, ViewGroup arg2) { 

try { 
    ViewHolder holder = new ViewHolder(); 

    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 

    if (convertView == null) { 

     convertView = layout_inflater.inflate(R.layout.dashbordmenu_listadapter, null); 
     holder.txtMenutitle = (TextView) convertView.findViewById(R.id.txtPersonList); 
     holder.checkAppList = (CheckBox) convertView.findViewById(R.id.checkPersonList); 
     convertView.setTag(holder); 
     convertView.setTag(R.id.txtPersonList, holder.txtMenutitle); 
     convertView.setTag(R.id.checkPersonList, holder.checkAppList); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.checkAppList.setTag(position); 
    holder.txtMenutitle.setText(arrayListDashboard1.get(position).getMenuTitle()); 
    holder.checkAppList.setChecked(arrayListDashboard1.get(position).isSelected()); 
    holder.checkAppList.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      int selectPosition = (int) buttonView.getTag(); 
      if(buttonView.isChecked()) 
      { 
       selectedAppId = arrayListDashboard1.get(selectPosition).getMenuId(); 
       Log.d("TEST","selectedAppId = "+selectedAppId); 

      } else { 
       notSelectedAppId = arrayListDashboard1.get(selectPosition).getMenuId(); 
        Log.d("TEST","notSelectedAppId = "+notSelectedAppId); 
      } 
     } 
    }); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 
return convertView; 
} 
public class ViewHolder { 
    TextView txtMenutitle; 
    public CheckBox checkAppList; 
    } 
+0

行'holder.checkAppListList.setChecked(arrayListDashboard1.get(position).isSelected());'可能是問題。 可能嘗試在'ArrayList '或'Map ' – canihazurcode

+0

中保存每個視圖的狀態此外,'isSelected()'不等於'isChecked()' – canihazurcode

回答

1

第一種方法:

一個布爾字段加入你的模型。將其設置爲默認值true。如果複選框未選中,則將布爾字段設置爲false。根據布爾字段更新您的複選框。

第二種方法:

使用SparseBooleanArray,在適配器初始化SparseBooleanArray。它將保持位置和布爾值。所以你可以保留你的複選框的值。

SparseBooleanArray文獻:

不同於布爾的標準陣列中,可以有在索引間隙。 與使用HashMap將 整數映射到布爾值相比,它的目的是提高內存效率,因爲它避免了自動裝箱鍵和 值,並且其數據結構不依賴於每個映射的額外入口對象 。

第三種方法:

由於LunarWatcher說,簡單地初始化布爾的ArrayList和更新您的複選框。

+0

或者,保持布爾數組跟蹤複選框 – Zoe

+1

是的,好主意。我會添加它。感謝@ LunarWatcher –

0

在你的模型需要一個布爾值,保持複選框的記錄其是否檢查與否,並使用它,而結合的觀點

0

RecylerView滾動時重新使用視圖,因此您必須爲每個列表項目選中複選框的狀態。在BindViewHolder中,您將檢查該位置的狀態並相應地設置複選框的狀態。

0

設置一個布爾變量'isCheck'給您的模型類並將其設置爲默認false。根據複選框值更改爲true或false來更改此值。 並檢查複選框更改事件isCheck是true或false。

相關問題