[英]How to save state of CheckBox while scrolling in ListView?
I have used ListView with custom adapter, so my ListView includes CheckBox, but problem is that when I scroll down, checked CheckBoxes uncheck, how can I do it with this code? 我已经将ListView与自定义适配器一起使用,所以ListView包括CheckBox,但是问题是当我向下滚动时,选中CheckBoxes取消选中该如何使用此代码呢?
UPDATE 更新
My custom adapter: 我的自定义适配器:
public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private List<Integer> checkedItems;
private final String DefaultApps = "def_apps";
public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
super(context, R.layout.apps, values);
this.context = context;
this.checkedItems = checkedItems;//XXX
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
String prefNameDefaultAppsVer = myPrefsApps.getString(DefaultAppsVer, "");
LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.apps, parent, false);
TextView text_apps = (TextView)rowView.findViewById(R.id.text_apps);
CheckBox check = (CheckBox)rowView.findViewById(R.id.check_apps);
text_apps.setText(prefNameDefaultApps.split("\n")[position]);
check.setChecked(checkedItems.contains((Integer) position));
return rowView;
}
}
And my Activity: 我的活动:
public class AppsActivity extends ListActivity {
private final String DefaultApps = "def_apps";
private List<Integer> checkedItems = new ArrayList<Integer>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AppsArrayAdapter adapter = new AppsArrayAdapter(this, prefNameDefaultApps.split("\n"), checkedItems);
setListAdapter(adapter);
}
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
if(checkedItems.contains((Integer) position)) checkedItems.remove((Integer) position);
else checkedItems.add((Integer) position);
}
you should use MyAdapter newad=(MyAdapter)adapter.getAdapter(); 您应该使用MyAdapter newad =(MyAdapter)adapter.getAdapter(); newad.notifyDataSetChanged(); newad.notifyDataSetChanged(); this code in onitem click method and MyAdapter is class of Adapter and make new object like this one and in adapter class you should have to write a line 此代码在onitem click方法中,而MyAdapter是Adapter的类,并像这样创建新对象,而在adapter类中,您必须写一行
LayoutInflater in; LayoutInflater中; in=(LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); in =(LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); in adapter constructor simple 在适配器构造函数中简单
// initialise the list
private List<Integer> selection = new ArrayList<Integer>();
for (String str: prefNameDefaultApps.split("\n")) {
selection.add(0);
}
// setting the list
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
if(CheckBox is checked) {//(check if the checkbox is checked )
selection.set(position, 1);
}
else{
selection.set(position, 0);
}
}
// show in the listView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
....
....
check.setChecked(selection.get(position) == 0 ? false : true);
}
This should get you going :) 这应该可以帮助您:)
I'm not entirely sure whether there is a standard solution in Android, but this should do the trick: 我不完全确定Android中是否有标准解决方案,但这应该可以解决问题:
public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private List<Integer> checkedItems;//Here we save the position of the selected items.
private final String DefaultApps = "def_apps";
//This will be invoked when one of the CheckBoxes gets clicked. It will update the checkedItems list.
private View.OnClickListener onClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Integer position = (Integer) v.getTag();
if(checkedItems.contains(position)) checkedItems.remove(position);
else checkedItems.add(position);
}
};
public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
super(context, R.layout.apps, values);
this.context = context;
this.checkedItems = checkedItems;//XXX
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
//You shouldn't inflate the View everytime getView() is called,
/*LayoutInflater inflater = (LayoutInflater)context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.apps, parent, false);*/
//rather let the superclass handle it as it's more efficient.
View rowView = super.getView(position, convertView, parent);
TextView text_apps = (TextView)rowView.findViewById(R.id.text_apps);
CheckBox check = (CheckBox)rowView.findViewById(R.id.check_apps);
text_apps.setText(prefNameDefaultApps.split("\n")[position]);
check.setChecked(checkedItems.contains((Integer) position));//XXX
check.setTag((Integer) position);//XXX
check.setOnClickListener(onClickListener);//XXX
return rowView;
}
} }
In your ListActivity
, add a field private List<Integer> checkedItems = new ArrayList<Integer>;
在您的ListActivity
,添加一个字段private List<Integer> checkedItems = new ArrayList<Integer>;
. 。 You have to pass this List in the Adapter constructor! 您必须在Adapter构造函数中传递此List!
If you want to check whether the nth item in your ListView
was selected, just look whether n is saved in checkedItems, ie 如果要检查是否已选择ListView
的第n个项目,只需查看n是否保存在checkedItems中,即
if(checkedItems.contains(requestedItemPosition)) {
//Item was selected.
} else {
//Item was not selected.
}
I really recommend you not to inflate the views by yourself. 我真的建议您不要自己夸大观点。
Try this: (your custom adapter) 试试这个:(您的自定义适配器)
public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private List<Integer> checkedItems;
private final String DefaultApps = "def_apps";
LayoutInflater inflater;
public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
super(context, R.layout.apps, values);
this.context = context;
this.checkedItems = checkedItems;//XXX
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
String prefNameDefaultAppsVer = myPrefsApps.getString(DefaultAppsVer, "");
View rowView = convertView;
ViewHolder viewH = new ViewHolder();
if ( rowView == null){
rowView = inflater.inflate(R.layout.apps, parent, false);
viewH.text_apps = (TextView)rowView.findViewById(R.id.text_apps);
viewH.check = (CheckBox)rowView.findViewById(R.id.check_apps);
rowView.setTag(viewH);
}else{
viewH = (ViewHolder) rowView.getTag();
}
viewH.text_apps.setText(prefNameDefaultApps.split("\n")[position]);
viewH.check.setChecked(checkedItems.contains((Integer) position));
return rowView;
}
static class ViewHolder {
public TextView text_apps;
public CheckBox check;
}
} }
Hope this helps :) 希望这可以帮助 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.