繁体   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