[英]Checkboxes in Listview custom adapter auto call onCheckChangeListener on scrolling
我用自定義適配器做了一個listview。 它具有一個Imageview,textview和一個復選框
---------------------------------------
<ImageView --- textView --- checkbox >
---------------------------------------
我正在使用一個名為“ mCheckStates”的SparseBooleanArray來跟蹤復選框的狀態。 我也想限制用戶一次只選中兩個復選框。 為此,我使用了一個int變量作為計數器。
但是,當我滾動listView onCheckChangedListener時,該計數減少了一個,有時減少了兩個,從而允許用戶選中3或4個復選框。
我該如何阻止這種情況的發生? 請幫助我找到解決方案。 謝謝。
碼
protected class MyCustomAdapter extends ArrayAdapter<String> implements
CompoundButton.OnCheckedChangeListener {
ArrayList<String> myList;
int count = 0;
ViewHolder holder = null;
public MyCustomAdapter(Context context, int textViewResourceId,
ArrayList<String> sList) {
super(context, textViewResourceId, sList);
mCheckStates = new SparseBooleanArray(sList.size());
myList = sList;
}
private SparseBooleanArray mCheckStates;
private class ViewHolder {
TextView text;
CheckBox chkbox;
ImageView imageview;
}
@Override
public int getCount() {
return stg1.size();
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.new_search_adptr, null);
holder = new ViewHolder();
holder.text = (TextView) convertView
.findViewById(R.id.adapterText1);
holder.chkbox = (CheckBox) convertView
.findViewById(R.id.checkBox1);
holder.imageview = (ImageView) convertView
.findViewById(R.id.imageView1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkbox.setTag(position);
holder.chkbox.setChecked(mCheckStates.get(position, false));
holder.chkbox.setOnCheckedChangeListener(this);
holder.text.setText(stg1.get(position).toString());
holder.imageview.setImageBitmap(arr_img.get(position));
return convertView;
}
public boolean isChecked(int position) {
System.out.println("inside isChecked");
return mCheckStates.get(position, false);
}
public void setChecked(int position, boolean isChecked) {
System.out.println("inside setChecked");
mCheckStates.put(position, isChecked);
}
public void toggle(int position) {
System.out.println("inside toggle");
setChecked(position, !isChecked(position));
}
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
System.out.println("\n inside onCheckedChanged: " + isChecked);
if (isChecked) {
System.out.println("inside isChecked true");
System.out.println("count= " + count);
if (count >= 2) {
// count--;
System.out.println("inside count>2: " + count);
buttonView.setChecked(false);
Toast.makeText(getApplicationContext(),
"Please select only two cars!", Toast.LENGTH_LONG)
.show();
} else {
count++;
System.out.println("inside else: " + count);
mCheckStates.put((Integer) buttonView.getTag(), isChecked);
}
} else {
System.out.println("inside isChecked false" + count);
mCheckStates.put((Integer) buttonView.getTag(), isChecked);
count--;
}
}
}
我假設您的CustomAdapter用於ListView。 事情就是這樣,單擊單元格進行檢查更加方便。
因此,您可以做的是在自己的適配器上設置一個偵聽器:
adapter .setOnItemClickListener();
然后在活動/片段中實現onItemClickListener
它將捕獲所有單元格的點擊,並向您提供該單元格在列表中的位置。
如果在適配器中用一些Holder類填充單元格並將其設置為單元格的標記,則可以在onItemClick方法中獲取該Holder:
FiltreCellHolder filtreCellHolder = null;
filtreCellHolder = (FiltreCellHolder) view.getTag();
然后根據您的全局檢查列表,您可以測試是否檢查了該視圖,並且由於用戶單擊了該視圖,因此您可以檢查/取消對其進行查看:
filtreCellHolder.cellCheck.setChecked(!filtreCellHolder.cellCheck.isChecked());
adapter.notifyDataSetChanged();
我希望這能幫到您。 請將此代碼更改為您的格式
public class ImageAdapter extends BaseAdapter {
private LayoutInflater mInflater;
public ImageAdapter() {
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void initialize() {
count = myList.size();
thumbnailsselection = new boolean[count];
notifyDataSetChanged();
}
public int getCount() {
return arrPath.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.galleryitem, null);
holder.imageview = (ImageView) convertView
.findViewById(R.id.thumbImage);
holder.checkbox = (CheckBox) convertView
.findViewById(R.id.itemCheckBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.checkbox.setId(position);
holder.imageview.setId(position);
holder.imageview.setAdjustViewBounds(true);
holder.checkbox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v;
int id = cb.getId();
if (thumbnailsselection[id]) {
cb.setChecked(false);
thumbnailsselection[id] = false;
} else {
cb.setChecked(true);
thumbnailsselection[id] = true;
}
}
});
holder.imageview.setImageBitmap(decodeFile(arrPath[position]));
// holder.imageview.setScaleType(ScaleType.FIT_XY);
// holder.imageview.setAdjustViewBounds(true);
holder.checkbox.setChecked(thumbnailsselection[position]);
holder.id = position;
return convertView;
}
}
請在按鈕單擊中檢查此條件
final int len = thumbnailsselection.length;
int cnt = 0;
String selectImages = "";
path = new ArrayList<String>();
for (int i = 0; i < len; i++) {
if (thumbnailsselection[i]) {
cnt++;
selectImages = arrPath[i];
path.add(selectImages);
}
}
if (cnt == 0) {
Toast.makeText(getApplicationContext(),
"Please select at least one image",
Toast.LENGTH_LONG).show();
} else if (cnt > 5) {
Toast.makeText(getApplicationContext(),
"Please select only 5 images", Toast.LENGTH_LONG)
.show();
} else {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.