[英]Android: Listview don't save a state of checkbox
我檢查所有具有類似問題的主題,但仍然呆在死點。 我有一個帶有聯系人列表的列表視圖,但是當我向下滾動和向上滾動列表視圖時,不會保存選擇的狀態。 所有復選框均設置為false。 當我調試時,當我滾動列表視圖時,我的onClickListener認為該復選框已簽名並對此進行了重置。 我什么都做,其他帶有位置布爾值的數組,等等等等,但我仍然不知道該怎么辦:(我將非常感謝您的幫助:)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
readContacts();
Contact_Database dbhandler = new Contact_Database(
getApplicationContext(), null, null, 1);
numbers.addAll( dbhandler.getAllNumbers());
System.out.println("onCreate");
ListView lv = getListView();
registerForContextMenu(lv);
lv.setTextFilterEnabled(true);
lv.clearChoices();
MyAdapter adapter = (new MyAdapter(this, R.layout.contact_list_sms, contacts));
adapter.notifyDataSetChanged();
lv.setAdapter(adapter);
}
/**
* When I destroy intent i send request to database, faster!
*/
@Override
protected void onDestroy() {
super.onDestroy();
for (int i = 0; i < numbers.size(); ++i)
System.out.println("@@@@" + numbers.get(i));
swap_contacts();
}
class MyAdapter extends ArrayAdapter<Contact> {
LayoutInflater inflat;
public MyAdapter(Context context, int textViewResourceId,
ArrayList<Contact> objects) {
super(context, textViewResourceId, objects);
inflat = LayoutInflater.from(context);
System.out.println("LOLLLLL");
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return (position == this.getCount() - 1) ? 1 : 0;
}
@Override
public int getViewTypeCount() {
return 2;
}
// if that contact exist in database? numbers, in onCreate method
// i init this with saved position from databse
private boolean exist(String x) {
for (int i = 0; i < numbers.size(); i++)
if (numbers.get(i).compareTo(x) == 0)
return true;
return false;
}
@SuppressLint("NewApi")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("ROWS !!! ->" + numbers.size());
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflat.inflate(R.layout.contact_row, null);
holder.textView1 = (TextView) convertView
.findViewById(R.id.name);
holder.textView2 = (TextView) convertView
.findViewById(R.id.number);
holder.on_off = (CheckBox) convertView
.findViewById(R.id.enable);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Contact it = contacts.get(position);
Log.v("XXX", holder.toString());
if (it != null) {
holder.textView1.setText(contacts.get(position).name);
holder.textView2.setText(contacts.get(position).phone);
// update state of checbox from database
if (exist(contacts.get(position).phone))
holder.on_off.setChecked(true);
else
holder.on_off.setChecked(false);
}
final int element_position = position;
holder.on_off
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
// update list when we click on it
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
String nr_telefonu = contacts.get(element_position).phone;
if (isChecked) {
numbers.add(nr_telefonu);
} else {
numbers.remove(nr_telefonu);
}
}
});
return convertView;
}
@Override
public Contact getItem(int position) {
return contacts.get(position);
}
private class ViewHolder {
TextView textView1, textView2;
CheckBox on_off;
public String toString() {
return "-";
}
}
}
滾動時,列表不會保存狀態,因為每次為行項目創建新對象時。 因此,您需要借助Pojo類(Setter和getter)顯式保存CheckBox的狀態。
在getView()方法中,您需要檢查每個復選框的值。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
////////////////////
在setOnCheckedChangeListener上,您需要保存復選框的狀態
holder.on_off
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
// update list when we click on it
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
// need to save the state
有關更多詳細信息,請參閱以下博客
http://amitandroid.blogspot.in/2013/03/android-listview-with-checkbox-and.html
您可以根據需要進行更改。
感謝您的回答:)我為每個復選框按鈕創建一個帶有狀態的數組stan。 Tommorrow我將嘗試重新構建所有類,如博客上的列表,這可能對我有幫助。
但是當我這樣做時:保存狀態:
holder.on_off
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
// update list when we click on it
// this.setChecked(stan[position]);
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
String nr_telefonu = p.get(element_position).phone;
buttonView.setChecked(stan[element_position]);
stan[element_position] = isChecked;
}
});
刷新按鈕狀態
if (it != null) {
holder.textView1.setText(contacts.get(position).name);
holder.textView2.setText(contacts.get(position).phone);
// update state of checbox from database
holder.on_off.setChecked(stan[position]);
}
我仍然站在死點,什么都沒有改變
我已經發布了針對該問題的解決方案,在該解決方案下,我花費了大量時間進行查找,並且對我有用!
public class RowAdapter extends ArrayAdapter<Rows> { Context context; int layoutResourceId; ArrayList<Rows> data; boolean[] checkBoxState; RowHolder rowHolder; public RowAdapter(Context context, int layoutResourceId, ArrayList<Rows> data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; checkBoxState = new boolean[data.size()]; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View row = convertView; RowHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new RowHolder(); holder.textView1 = (TextView)row.findViewById(R.id.textView1); holder.textView2 = (TextView)row.findViewById(R.id.textView2); holder.textView3 = (TextView)row.findViewById(R.id.textView3); holder.textView4 = (TextView)row.findViewById(R.id.textView4); holder.checkBox=(CheckBox) row.findViewById(R.id.checkBox1); row.setTag(holder); } else{ holder = (RowHolder)row.getTag(); } Rows rows = data.get(position); holder.textView1.setText(rows.address); holder.textView2.setText(rows.tenancy); holder.textView3.setText(rows.location); holder.textView4.setText(rows.name); holder.checkBox.setChecked(checkBoxState[position]); holder.checkBox.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if(((CheckBox)v).isChecked()) checkBoxState[position]=true; else checkBoxState[position]=false; } }); return row; } static class RowHolder { TextView textView1; TextView textView2; TextView textView3; TextView textView4; CheckBox checkBox; } }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.