[英]Storing CheckBox state in ListView
我在每個列表項中都有一個帶有CheckBox
的ListView
,我將檢查狀態存儲在SharedPreferences
,但是每次滾動選中一項時,所有項都未選中或選中,這取決於調用checkbox.setChecked( ); ListViewAdapter.java
public class ListViewAdapter extends BaseAdapter {
Context context;
AppPicker.Package[] packagesForAdapter;
SharedPreferences.Editor editor;
private Intent blackListIntent;
public ListViewAdapter(Context context, AppPicker.Package packages[]) {
this.context = context;
this.packagesForAdapter = packages;
}
@Override
public int getCount() {
return packagesForAdapter.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
static class ViewHolder {
TextView text;
ImageView icon;
CheckBox checkBox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
SharedPreferences sharedPreferences = context.getSharedPreferences("sharedPreferences", Context.MODE_PRIVATE);
ViewHolder viewHolder;
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.icon_text);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_image);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.icon_check);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
editor = sharedPreferences.edit();
viewHolder.icon.setImageDrawable(packagesForAdapter[position].icon);
viewHolder.text.setText(packagesForAdapter[position].label);
//viewHolder.checkBox.setChecked(sharedPreferences.getBoolean("CheckValue" + position, false));
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
int pos = position;
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
if(isChecked) {
Toast.makeText(context, "Item checked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent = new Intent("com.jason.floating.notification.appPickerFragment.ListViewAdapter");
blackListIntent.putExtra("packageName", packagesForAdapter[pos].name);
}else{
Toast.makeText(context, "Item unchecked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent.removeExtra("packageName");
}
context.sendBroadcast(blackListIntent);
editor.putBoolean("CheckValue" + pos, isChecked);
editor.commit();
}
});
return convertView;
}
}
任何想法請幫忙,因為我一直在互聯網上尋找,但沒有運氣/ _ \\
編輯:修改后的代碼:公共類ListViewAdapter擴展BaseAdapter {
Context context;
AppPicker.Package[] packagesForAdapter;
SharedPreferences.Editor editor;
private Intent blackListIntent;
boolean isChecked;
public ListViewAdapter(Context context, AppPicker.Package packages[]) {
this.context = context;
this.packagesForAdapter = packages;
}
@Override
public int getCount() {
return packagesForAdapter.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
static class ViewHolder {
TextView text;
ImageView icon;
CheckBox checkBox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
ViewHolder viewHolder;
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.icon_text);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_image);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.icon_check);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
editor = sharedPreferences.edit();
viewHolder.icon.setImageDrawable(packagesForAdapter[position].icon);
viewHolder.text.setText(packagesForAdapter[position].label);
viewHolder.checkBox.setChecked(packagesForAdapter[position].isChecked);
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
int pos = position;
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if(b) {
Toast.makeText(context, "Item checked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent = new Intent("com.jason.floating.notification.appPickerFragment.ListViewAdapter");
blackListIntent.putExtra("packageName", packagesForAdapter[pos].name);
packagesForAdapter[pos].isChecked = true;
editor.commit();
}else{
Toast.makeText(context, "Item unchecked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent.removeExtra("packageName");
packagesForAdapter[pos].isChecked = false;
editor.commit();
}
context.sendBroadcast(blackListIntent);
//editor.putBoolean("CheckValue" + pos, isChecked);
//editor.commit();
}
});
return convertView;
}
}
EDIT2:修改后的代碼:公共類ListViewAdapter擴展了BaseAdapter {
Context context;
AppPicker.Package[] packagesForAdapter;
SharedPreferences.Editor editor;
private Intent blackListIntent;
boolean isChecked;
public ListViewAdapter(Context context, AppPicker.Package packages[]) {
this.context = context;
this.packagesForAdapter = packages;
}
@Override
public int getCount() {
return packagesForAdapter.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
static class ViewHolder {
TextView text;
ImageView icon;
CheckBox checkBox;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
ViewHolder viewHolder;
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.icon_text);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_image);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.icon_check);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
editor = sharedPreferences.edit();
viewHolder.icon.setImageDrawable(packagesForAdapter[position].icon);
viewHolder.text.setText(packagesForAdapter[position].label);
viewHolder.checkBox.setChecked(packagesForAdapter[position].isChecked);
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
/**
if(isCheck) {
Toast.makeText(context, "Item checked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent = new Intent("com.jason.floating.notification.appPickerFragment.ListViewAdapter");
blackListIntent.putExtra("packageName", packagesForAdapter[pos].name);
packagesForAdapter[pos].isChecked = true;
}else{
Toast.makeText(context, "Item unchecked: " + pos + " App: " + packagesForAdapter[pos].name, Toast.LENGTH_SHORT).show();
blackListIntent.removeExtra("packageName");
packagesForAdapter[pos].isChecked = false;
}
context.sendBroadcast(blackListIntent);
editor.putBoolean("CheckValue" + pos, isChecked);
editor.commit();
packagesForAdapter[pos].isChecked = isCheck;
**/
packagesForAdapter[position].isChecked = isChecked;
}
});
return convertView;
}
}
您應該在類AppPicker.Package中定義一個名為isChecked的變量。
因此,在setOnCheckedChangeListener中,您將已檢查狀態存儲在AppPicker.Package [pos] .isChecked中
然后,在您的getView方法中:
您將調用:viewHolder.checkBox.setChecked(AppPicker.Package [pos] .isChecked)//類似的東西。
有很多方法可以做到這一點。
更新:您需要一種方法可以找到packagesForAdapter中每個項目的復選框。 您創建它的ID,它可以是任何唯一的。
例如,在創建數據並使用它時,將一個計數器添加到packagesForAdapter。
String anIdForThisCheckbox = packagesForAdapter[position].id;
在您的getView()中
...
final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context);
boolean isChecked = pref.getBoolean(anIdForThisCheckbox, false);
viewHolder.checkBox.setChecked(isChecked );
...
為您的復選框創建一個onClickListener:
viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Editor editor = pref.edit();
if (viewHolder.checkBox.isChecked()) {//Selected
editor.putBoolean(anIdForThisCheckbox, true);//save state
} else {
editor.putBoolean(anIdForThisCheckbox, false);
}
}
editor.apply/commit
});
...
您將isChecked添加為AppPicker.Package的類成員。
然后:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
SharedPreferences sharedPreferences = context.getSharedPreferences("sharedPreferences", Context.MODE_PRIVATE);
ViewHolder viewHolder;
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
convertView = layoutInflater.inflate(R.layout.list_item, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.icon_text);
viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon_image);
viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.icon_check);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
editor = sharedPreferences.edit();
viewHolder.icon.setImageDrawable(packagesForAdapter[position].icon);
viewHolder.text.setText(packagesForAdapter[position].label);
viewHolder.checkBox.setChecked(packagesForAdapter[position].isChecked);// add by tauitdnmd
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
packagesForAdapter[position].isChecked = isChecked; // add by tauitdnmd
}
});
return convertView;
}
謝謝大家的支持。 但是我終於設法找到了解決這個煩人問題的方法。 使用模型存儲復選框的狀態,在每次列表視圖更新時獲取該值,並設置復選框的選中狀態。 我花了一些時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.