LeojAngelico
LeojAngelico

Reputation: 28

Custom listview issue with checkbox

I'm trying to create a listview with checkboxes. so this is the issue whenever I click a checkbox and scroll it down or up, it automatically checks other checkbox in the list that i didn't click. i already search and read other thread here with the same issue but none of them solved my problem.

this is what I have done so far.

 public View getView(final int position, View convertView, ViewGroup parent) {


        ViewHolder viewHolder = null;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.row_songs, null, true);

            viewHolder = new ViewHolder();

            viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox);
            viewHolder.tvSongName = (TextView) convertView.findViewById(R.id.tvSongName);
            viewHolder.tvSongArtist = (TextView) convertView.findViewById(R.id.tvArtistName);

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }


        viewHolder.tvSongName.setText(_songs.get(position).getSongname());
        viewHolder.tvSongArtist.setText(_songs.get(position).getArtistname());
        viewHolder.checkBox.setTag(R.integer.btnplusview, convertView);

        viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    int getPosition = (Integer) buttonView.getTag(); 
                    _songs.get(getPosition).setSelected(buttonView.isChecked()); 


                    if (_songs.get(getPosition).isSelected()) {
                        _songs.get(getPosition).setSelected(false);
                        Toast.makeText(getApplicationContext(), "position " + position + " " + _songs.get(position).getSongUrl(),
                                Toast.LENGTH_LONG).show();
                        Log.e("URL", _songs.get(position).getSongUrl() + " ");
                    } else {
                        _songs.get(getPosition).setSelected(true);

                    }


                }


            });
            convertView.setTag(R.id.tvSongName, viewHolder.tvSongName);
            convertView.setTag(R.id.tvArtistName, viewHolder.tvSongArtist);
            convertView.setTag(R.id.checkBox, viewHolder.checkBox);

        viewHolder.checkBox.setTag(position);

        viewHolder.checkBox.setChecked(_songs.get(position).isSelected());

        return convertView;
    }

what should I do to solve this problem?

Thanks in Advance!

Upvotes: 0

Views: 52

Answers (2)

Kapil G
Kapil G

Reputation: 4141

When you scroll, setOnCheckedChangeListener is called. So to handle that in get view you need to do the below -

viewHolder.checkBox.setOnCheckedChangeListener(null);
viewHolder.checkBox.setChecked(_songs.get(position).isSelected());

You first need to set onchecked null so that on scroll when view is getting populated and you are assigning value to checkbox views, you don't call the onCheckedListener.

And then you need to call OnCheckedChangeListener

viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int getPosition = (Integer) buttonView.getTag(); 
              //remove this line from the code. The below one
                _songs.get(getPosition).setSelected(buttonView.isChecked()); 


                if (_songs.get(getPosition).isSelected()) {
                    _songs.get(getPosition).setSelected(false);
                    Toast.makeText(getApplicationContext(), "position " + position + " " + _songs.get(position).getSongUrl(),
                            Toast.LENGTH_LONG).show();
                    Log.e("URL", _songs.get(position).getSongUrl() + " ");
                } else {
                    _songs.get(getPosition).setSelected(true);

                }


            }


        });

Upvotes: 0

Naveen Tamrakar
Naveen Tamrakar

Reputation: 3339

Whenever you scroll setOnCheckedChangeListener is called

Removing setOnCheckedChangeListener and implement setOnClickListener

viewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (viewHolder.checkbox.isChecked()) {
                         your logic id true
                    } else {
                        your logic id false
                    }
                }
            });

Upvotes: 2

Related Questions