Developer
Developer

Reputation: 343

Android Expandable listview on scroll it changes selected checkbox state

I am using expandable listview in group parent level i am having checkbox

  @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            View view = convertView;
            ViewHolder holder = new ViewHolder();
            if(view == null){
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             //   convertView = infalInflater.inflate(R.layout.home_activity_lv_sync_adapter, null);
                view = infalInflater.inflate(R.layout.home_activity_lv_sync_adapter, null);

                holder.ckupdate = (CheckBox) view.findViewById(R.id.ck_update);

                view.setTag(holder);
            } else {
                holder = (ViewHolder) view.getTag();
            }
            holder.ckupdate.setTag(groupPosition);
            holder.ckupdate.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    int position = (Integer) buttonView.getTag();
                   // objects.get(position).setChecked(buttonView.isChecked());
                }
            });
           // holder.ckupdate.setChecked(isChecked(position));

            return view;
        }

But when i am scrolling exp list it changes state( i am not taking data from any list or DB just user check and unchecked )

thanks in advance

Upvotes: 0

Views: 933

Answers (2)

unedim
unedim

Reputation: 91

Maybe its too late for this answer, but I think that this is simpler solution for this. Just try create new view every time (remove checking if view == null before that).

Instead of:

View view = convertView;
ViewHolder holder = new ViewHolder();
if(view == null){
    LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = infalInflater.inflate(R.layout.home_activity_lv_sync_adapter, null);
    holder.ckupdate = (CheckBox) view.findViewById(R.id.ck_update);
    view.setTag(holder);
} else {
    holder = (RecyclerView.ViewHolder) view.getTag();
}

Try with this:

View view;
ViewHolder holder = new ViewHolder();
LayoutInflater infalInflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view =infalInflater.inflate(R.layout.home_activity_lv_sync_adapter,null);
holder.ckupdate =(CheckBox)view.findViewById(R.id.ck_update);
view.setTag(holder);

Also, there is no need for using holder for this parent view. You can use convertView instead.

Upvotes: 2

Developer
Developer

Reputation: 343

Hello i solved my problem by following

 holder.ckupdate.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                    int position = (Integer) buttonView.getTag();

                    if (isChecked) {
                        selectedStrings.add(position + " ");
                        ii.add(position);
                    } else {
                        selectedStrings.remove(position + "");
//                        ii.remove(position);
                        ii.removeAll(Arrays.asList(position));
                    }
                    System.out.println("selectedStrings!!!! " + selectedStrings);
                    for(int i=0;i<ii.size();i++)
                    {
                        System.out.println("HERE !! "+ii.get(i));
                    }
                    // objects.get(position).setChecked(buttonView.isChecked());
                }
            });

Upvotes: 0

Related Questions