【问题标题】:ListView Checkbox Save StateListView 复选框保存状态
【发布时间】:2015-09-28 18:22:19
【问题描述】:

我对每个列表项都使用 Checkbox,当用户点击任何复选框时,我将该列表项存储到 SQLite 数据库中,但是每当我重新启动我的应用程序时,都不会检查我检查过的列表项早一点。

那么如何将状态保存到复选框?

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // convert view = design
    View v = convertView;

    if (v == null) {

        holder = new ViewHolder();
        v = vi.inflate(Resource, null);

        holder.tvName = (TextView) v.findViewById(R.id.textView1);          
        holder.checkBox = (CheckBox) v.findViewById(R.id.cbBox);

        boolean strDataExist = activity.myDb.Exists(actorList.get(position).getName());
        if(strDataExist)
        {
            actorList.get(position).setChecked(true);
        }
        else
        {
            actorList.get(position).setChecked(false);
        }

        v.setTag(holder);

    } 
    else 
    {
        holder = (ViewHolder) v.getTag();           
    }           

【问题讨论】:

  • 你在哪里设置复选框的选中值

标签: android sqlite listview checkbox


【解决方案1】:

你应该在膨胀数据之前检查每个数据是否在数据库中,根据结果你应该检查复选框的值,你没有检查。

你需要检查

holder.checkBox.setChecked(true/false);

【讨论】:

  • 我已经更新了我的代码,检查上面但仍然面临同样的问题,我错过了
  • 你需要检查 => holder.checkBox.setChecked(true/false);
【解决方案2】:

在getView方法中,代码应该是

    if(strDataExist)
    {
        holder.checkBox.setChecked(true);
    }
    else
    {
        holder.checkBox.setChecked(false);
    }

【讨论】:

  • 感谢我刚刚替换了 actorList.get(position).setChecked(true);与 holder.checkBox.setChecked(true);我完成了..
  • 不客气。可以用这个holder.checkBox.setChecked(strDataExist); 简化代码,只写 if else 语句。
【解决方案3】:

我不确定您的问题,但我会尽力帮助您。

我认为你想用checked 初始化你的checkbox,这取决于你之前是否保存到database

getView 方法中,您应该使用public boolean Exists(String strServiceName) 方法检查服务是否存在于数据库中(方法名称应使用小写)。

...

holder.checkBox = (CheckBox) v.findViewById(R.id.cbBox);
holder.checkBox.setChecked(exists(actorList.get(position).getName().toString()));

问候。

更新 如果数据库中存在服务名称,则要保存服务状态。这可能是一个解决方案:

getView(...){
 //...
 if (databaseHandler.exists(serviceName)){
  Service service = new Service(serviceName, holder.checkBox.isChecked());
  databaseHandler.save(service);
 }
}

【讨论】:

  • 是的,如果列表项名称存在于数据库中,我想保存复选框的状态,但我不知道如何在 getView(..) 方法中检查该名称是否存在于数据库中
【解决方案4】:

试试这个方法,这对我有用

public class CustomAdapter extends BaseAdapter {
    private final LayoutInflater inflater;
    private final Context context;
    private List<ModelPooja> listData;

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) {
        context = mainActivity;
        this.listData = listData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
            holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
            holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checks.setOnCheckedChangeListener(null);
        holder.checks.setFocusable(false);

        if (listData.get(position).isselected) {
            holder.checks.setChecked(true);
        } else {
            holder.checks.setChecked(false);
        }

        holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean b) {

                if (checkMaxLimit()) {

                    if (listData.get(position).isselected && b) {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;

                    } else {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;
                        Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (b) {
                        listData.get(position).isselected = true;
                    } else {
                        listData.get(position).isselected = false;
                    }
                }
            }
        });

        holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME());
        return convertView;
    }

    public boolean checkMaxLimit() {
        int countermax = 0;
        for(ModelPooja item : listData){
            if(item.isselected){
                countermax++;
            }
        }
        return countermax >= 5;
    }

    public class ViewHolder {
        TextView tv;
        public CheckBox checks;
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-12
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多