Tôi có gì: chế độ xem danh sách tùy chỉnh với Văn bản và hộp kiểm. Khi cuộn Chế độ xem danh sách tùy chỉnh, giá trị hộp kiểm thay đổi
Sự cố: Giả sử màn hình của tôi chỉ có thể hiển thị 6 mục danh sách vào thời điểm và các mục khác không hiển thị. Vì vậy, tôi đã kiểm tra phần tử đầu tiên trong danh sách (mục tại vị trí 0). Tôi cuộn xuống để xem tất cả danh sách của tôi, khi tôi cuộn lên ở phần tử đầu tiên (mục tại vị trí 0), hộp kiểm được chọn chính xác. Tuyệt quá! Nhưng bây giờ có các mục mới được kiểm tra quá, ví dụ như mục ở vị trí 8 (vì khi tôi cuộn danh sách (đối với theRycicling) nó trở thành mục mới ở vị trí 0..remember màn hình của tôi chỉ hiển thị 7 phần tử tại thời điểm). Và nó trở thành kiểm tra, nhưng tôi chưa bao giờ kiểm tra nó!
Câu hỏi: Làm thế nào tôi có thể tránh được sự cố này? Tôi không muốn hộp kiểm mà tôi không nhấp vào thay đổi trạng thái của họ.
Dưới bộ chuyển đổi của tôi cho ListView với chức năng getView nơi tôi đã triển khai setOnCheckedChangeListener:
public class NewQAAdapterSelectFriends extends BaseAdapter {
private LayoutInflater mInflater;
private Person[] data;
public NewQAAdapterSelectFriends(Context context) {
mInflater = LayoutInflater.from(context);
}
public void setData(Person[] data) {
this.data = data;
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int item) {
return data[item];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_select_friends, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
viewHolder.nameText.setTag(viewHolder.nameText);
viewHolder.nameText.setTag(viewHolder.surnameText);
viewHolder.contactImage.setTag(data[position]);
viewHolder.checkBox.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
Person element = (Person) viewHolder.checkBox.getTag();
if(isChecked){
element.setCheck(buttonView.isChecked());
//data[position].setCheck(true); //this is equivalent to previous line
}
else{
//to-do
}
}
});
viewHolder.checkBox.setTag(data[position]);
} else {
}
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.nameText.setText(data[position].getName());
holder.surnameText.setText(data[position].getSurname());
holder.contactImage.setImageResource(data[position].getPhotoRes());
holder.contactImage.setScaleType(ScaleType.FIT_XY);
holder.checkBox.setChecked(data[position].isCheck());
return convertView;
}
static class ViewHolder {
TextView nameText;
TextView surnameText;
ImageView contactImage;
CheckBox checkBox;
}
}
Cảm ơn câu trả lời :)
EDIT: Với đề nghị tôi thay đổi getView tôi như bên dưới:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_select_friends, null);
viewHolder=new ViewHolder();
viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
viewHolder.nameText.setTag(viewHolder.nameText);
viewHolder.nameText.setTag(viewHolder.surnameText);
viewHolder.contactImage.setTag(data[position]);
viewHolder.checkBox.setChecked(data[position].isCheck());
viewHolder.checkBox.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
if(viewHolder.checkBox.isChecked()==true)
data[position].setCheck(true);
else
data[position].setCheck(false);
}
});
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.nameText.setText(data[position].getName());
viewHolder.surnameText.setText(data[position].getSurname());
viewHolder.contactImage.setImageResource(data[position].getPhotoRes());
viewHolder.contactImage.setScaleType(ScaleType.FIT_XY);
viewHolder.checkBox.setChecked(data[position].isCheck());
return convertView;
}
SITUATION SAU EDIT: Bây giờ, nếu tôi kiểm tra các mục ban đầu được hiển thị trên màn hình và sau đó tôi scrool danh sách, giá trị của họ được lưu một cách chính xác. Nhưng khi tôi di chuyển danh sách và ví dụ tôi muốn kiểm tra các hộp kiểm tra cây cuối cùng của danh sách của tôi sau đó sau khi tôi di chuyển chúng trở thành uncheked .... NHƯNG TẠI SAO ??????
SOLVED: Tôi giải quyết vấn đề của tôi về getView với mã này:
public class NewQAAdapterSelectFriends extends BaseAdapter {
private LayoutInflater mInflater;
private Person[] data;
boolean[] checkBoxState;
ViewHolder viewHolder;
public NewQAAdapterSelectFriends(Context context) {
mInflater = LayoutInflater.from(context);
}
public void setData(Person[] data) {
this.data = data;
checkBoxState=new boolean[data.length];
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int item) {
return data[item];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_select_friends, null);
viewHolder=new ViewHolder();
viewHolder.nameText=(TextView) convertView.findViewById(R.id.personName);
viewHolder.surnameText=(TextView) convertView.findViewById(R.id.personSurname);
viewHolder.contactImage=(ImageView) convertView.findViewById(R.id.personImage);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.checkBox);
convertView.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.nameText.setText(data[position].getName());
viewHolder.surnameText.setText(data[position].getSurname());
viewHolder.contactImage.setImageResource(data[position].getPhotoRes());
viewHolder.contactImage.setScaleType(ScaleType.FIT_XY);
viewHolder.checkBox.setChecked(checkBoxState[position]);
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(((CheckBox)v).isChecked()){
checkBoxState[position]=true;
data[position].setCheck(true);
}else{
checkBoxState[position]=false;
data[position].setCheck(false);
}
}
});
return convertView;
}
static class ViewHolder {
TextView nameText;
TextView surnameText;
ImageView contactImage;
CheckBox checkBox;
}
}
Tôi đã thấy hướng dẫn này để làm getView tôi: http://androidcocktail.blogspot.it/2012/04/adding-checkboxes-to-custom-listview-in.html
giải pháp vĩ đại, làm việc của nó đối với tôi – Ravikumar11
Chỉ một câu hỏi? Dữ liệu Person [] là gì? Ý tôi là nó trông như thế nào? – Josef
Giải pháp duy nhất có hiệu quả đối với tôi. –