user3839710
user3839710

Reputation: 125

I am making an app and getting issue in check box selection

Whenever I unchecked any one check box button then last one also being unchecked so I am confuse to understand that what is main issue. I think it is being recycled.

private ArrayList<MusterRollAttendanceMaster> list;
    private LayoutInflater inflator;
    private ViewHolder holder = null;;

    public MusterGridAdapter(Activity context,
            ArrayList<MusterRollAttendanceMaster> list) {
        super(context, R.layout.row, list);
        this.list = list;
        inflator = context.getLayoutInflater();
    }

    @SuppressLint("ViewTag")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = inflator.inflate(R.layout.row, null);
            holder = new ViewHolder();
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        holder.chk = (CheckBox) convertView.findViewById(R.id.checkbox);

        holder.chk.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                int count = list.size();
                boolean isAllChecked = true;

                for (int i = 0; i < count; i++)
                    if (!(list.get(i).getSelected())) {
                        isAllChecked = false;
                    }

                holder.chk.setChecked(isAllChecked);

            }

        });

        holder.chk
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    public void onCheckedChanged(CompoundButton view,
                            boolean arg1) {
                        int getPosition = (Integer) view.getTag();
                        list.get(getPosition).setSelected(view.isChecked());
                        for (int i = 0; i < list.size(); i++) {
                            if (!list.get(i).getSelected())
                                checkBox_header.setChecked(false);
                        }
                        int p = 0;
                        for (int i = 0; i < list.size(); i++) {
                            if (list.get(i).getSelected())
                                p++;
                        }
                        if (p == list.size())
                            checkBox_header.setChecked(true);
                    }
                });

        convertView.setTag(holder);
        convertView.setTag(R.id.checkbox, holder.chk);
        String part2;
        holder.chk.setTag(position);
        holder.jcn.setText(part2);

        holder.chk.setChecked(list.get(position).isSelected());

        return convertView;
    }

    public class ViewHolder {
        private TextView jcn;
        private TextView applicant;
        private CheckBox chk;
    }

    public int getCount() {

        count = list.size();
        return count;
    }
}

Upvotes: 0

Views: 39

Answers (3)

Chintan Bawa
Chintan Bawa

Reputation: 1386

Save CheckBox state in model class as boolean. When you change CheckBox state(checked or unchecked) also change boolean value in model class and just call notifyDataSetChanged(). It will make adapter know that you have changed the CheckBox state. Happy Coding.

Upvotes: 0

KoalaKoalified
KoalaKoalified

Reputation: 697

Try doing something like this:

Dimension at top:

private ArrayList<String> checkedNames = new ArrayList<>();

In your inflate view:

if (checkedNames.contains(holder.chk.getText().toString()))
    holder.chk.setChecked(true);
else
    holder.chk.setChecked(false);

holder.chk.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
     @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
       String name = buttonView.getText().toString(); //or declare your checkbox final
       if (isChecked)
          checkedNames.add(buttonView.getText().toString());
       else
          checkedNames.remove(buttonView.getText().toString());
    }
});

and when inflating your listview item it should be:

 convertView = inflator.inflate(R.layout.row, parent, false);

Upvotes: 0

user2231938
user2231938

Reputation: 78

Its problem specifically created by cell reusing of listview. Check the following link this will definitely help you

http://www.lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html

Android Click on listItem checks wrong checkbox

Upvotes: 1

Related Questions