簡體   English   中英

在ListView中存儲CheckBox狀態

[英]Storing CheckBox state in ListView

我在每個列表項中都有一個帶有CheckBoxListView ,我將檢查狀態存儲在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM