Oreo
Oreo

Reputation: 2594

ListView Checkbox Save State

I am using Checkbox with each and every list item, and when user do tap on any of the checkbox i am storing that list item into SQLite database, but whenever i do restart my app not getting check for list items those i checked earlier.

So How do I save state to Checkbox ?

@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();           
    }           

Upvotes: 3

Views: 1384

Answers (4)

Aditya Vyas-Lakhan
Aditya Vyas-Lakhan

Reputation: 13555

try this way,this worked for me

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;
    }
}

Upvotes: 0

Arth Tilva
Arth Tilva

Reputation: 2496

You should check every data before inflating whether that data is in DB or not, on the base of result you should check the value of checkbox, you are not checking.

You need to check

holder.checkBox.setChecked(true/false);

Upvotes: 4

zzas11
zzas11

Reputation: 1115

In getView method, the code should be

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

Upvotes: 3

Luis Ortiz
Luis Ortiz

Reputation: 1

I am not sure about your question, but I'm going to try help you.

I think that you want to inicializate your checkbox with checked or not depending if you have saved into database previously.

In the method getView you should check if the service exists in the database with method public boolean Exists(String strServiceName) (you shoud use lowercase for method's name).

...

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

Regards.

UPDATE If you want to save the service status if the the service name exists in the database. That coul be a solution :

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

Upvotes: 0

Related Questions