-1

i have a custom listview and custom adapter. each row has multiple items inside it, when i click on like button it change the color of imageview but it also effect the 4th,7th and 10th row.

after searching on internet i learned that i have to use getTag and setTag but i dont know how to use it. please help me in understanding the concept of getTag and setTag and solving this error.

here is my code:-

package rj.osmthemes;



import java.util.ArrayList;

import android.content.Context;
import android.os.Build;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;


import static android.R.attr.data;
import static rj.osmthemes.R.id.downlink;
import static rj.osmthemes.R.id.likebtn;
import static rj.osmthemes.R.id.likecount;


public class ListAdapter extends ArrayAdapter<DataModel> {
    customButtonListener customListner;
    private ArrayList<DataModel> dataSet;
    public String temp1;

    public interface customButtonListener {
        public void onButtonClickListner(int position,String value);
        public void onImageClickListner(int position,String value);
        public void onlikeImageClickListner(int position,String value);
        public void ondislikeImageClickListner(int position,String value);
    }

    public void setCustomButtonListner(customButtonListener listener) {
        this.customListner = listener;
    }

    private Context context;
    //private ArrayList<String> data = new ArrayList<String>();

    public ListAdapter(ArrayList<DataModel> data, Context context) {
        super(context, R.layout.list_layout, data);
        this.dataSet = data;
        this.context = context;

    }

    private int lastPosition = -1;

//    public ListAdapter(Context context, ArrayList<String> dataItem) {
//        super(context, R.layout.list_layout, dataItem);
//        this.data = dataItem;
//        this.context = context;
//    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;
        final DataModel dataModel = getItem(position);
        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.list_layout, null);
            viewHolder = new ViewHolder();

            viewHolder.themename = (TextView) convertView.findViewById(R.id.themename);
            viewHolder.madeby = (TextView) convertView.findViewById(R.id.madeby);
            viewHolder.downcount = (TextView) convertView.findViewById(R.id.downcount);
            viewHolder.likecount = (TextView) convertView.findViewById(likecount);
            viewHolder.dislikecount = (TextView) convertView.findViewById(R.id.dislikecount);

            viewHolder.ss1 = (ImageView) convertView.findViewById(R.id.img1);
            viewHolder.ss2 = (ImageView) convertView.findViewById(R.id.img2);
            viewHolder.ss3 = (ImageView) convertView.findViewById(R.id.img3);
            viewHolder.likebtn = (ImageView) convertView.findViewById(likebtn);
            viewHolder.dislikebtn = (ImageView) convertView.findViewById(R.id.dislikebtn);


            viewHolder.btndownload = (Button) convertView.findViewById(downlink);


            convertView.setTag(viewHolder);
            final String temp = getItem(position).toString();

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

        lastPosition = position;

        //final String temp = getItem(position).toString();
       // viewHolder.tempid =  Integer.parseInt(dataModel.getId());

        final String  ss1link,ss2link,ss3link,downlink;



        viewHolder.themename.setText(dataModel.getTheme_name());
        viewHolder.madeby.setText(dataModel.getMade_by());
        viewHolder.downcount.setText(dataModel.getDown_count());
        viewHolder.likecount.setText(dataModel.getLike_count());
        viewHolder.dislikecount.setText(dataModel.getDislike_count());
        ss1link = dataModel.getSs1();
        ss2link = dataModel.getSs2();
        ss3link = dataModel.getSs3();
        downlink = dataModel.getDown_link();
        // viewHolder.text.setText(temp);
        viewHolder.btndownload.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (customListner != null) {
                    int downcounttmp = Integer.parseInt(dataModel.getDown_count());
                    downcounttmp++;
                    viewHolder.downcount.setText(""+downcounttmp);

                    String name = downlink + "#" + dataModel.getTheme_name() + "#" + dataModel.getId() + "#" + downcounttmp;
                    customListner.onButtonClickListner(position,name);
                }

            }
        });
        viewHolder.ss1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (customListner != null) {

                    customListner.onImageClickListner(position,ss1link);
                }
            }
        });
        viewHolder.ss2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (customListner != null) {

                    customListner.onImageClickListner(position,ss2link);
                }
            }
        });
        viewHolder.ss3.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (customListner != null) {

                    customListner.onImageClickListner(position,ss3link);
                }
            }
        });

        viewHolder.likebtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (customListner != null) {

                    //  Toast.makeText(context, dataModel.getId() + "   {     " ,Toast.LENGTH_LONG).show();
                    if(viewHolder.check == 0){
                        int likecount = Integer.parseInt(dataModel.getLike_count());
                        likecount++;
                        viewHolder.likecount.setText(""+likecount);
                        String name = likecount + "#" + dataModel.getId();

                       // Toast.makeText(context,position + "  " + temp,Toast.LENGTH_LONG).show();

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

                            viewHolder.likebtn.setImageResource(R.drawable.ic_thumb_up_red_24dp);
                            //viewHolder.likebtn.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_thumb_up_red_24dp, getContext().getTheme()));
                            viewHolder.check = 1;
                        } else {
                            viewHolder.likebtn.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_thumb_up_red_24dp));
                            viewHolder.check = 1;
                        }
                        customListner.onlikeImageClickListner(position,name);
                    }
                    else {
                        Toast.makeText(context,"You cant use this action",Toast.LENGTH_LONG).show();
                    }


                }
            }
        });
        viewHolder.dislikebtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (customListner != null) {
                    if(viewHolder.check == 0) {

                        int dislikecount = Integer.parseInt(dataModel.getDislike_count());
                        dislikecount++;
                        viewHolder.dislikecount.setText(""+dislikecount);

                        String name = dislikecount + "#" + dataModel.getId();



                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                            viewHolder.dislikebtn.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_thumb_down_red_24dp, getContext().getTheme()));
                            viewHolder.check = 1;
                        } else {
                            viewHolder.dislikebtn.setImageDrawable(context.getResources().getDrawable(R.drawable.ic_thumb_down_red_24dp));
                            viewHolder.check = 1;
                        }
                        customListner.ondislikeImageClickListner(position,name);
                    }
                    else {
                        Toast.makeText(context,"You cant use this action",Toast.LENGTH_LONG).show();
                    }

                }
            }
        });


        Glide
                .with(context)
                .load(ss1link)
                .into(viewHolder.ss1);
        Glide
                .with(context)
                .load(ss2link)
                .into(viewHolder.ss2);
        Glide
                .with(context)
                .load(ss3link)
                .into(viewHolder.ss3);



        return convertView;
    }

    public class ViewHolder {
        TextView themename,madeby,downcount,likecount,dislikecount;
        Button btndownload;
        ImageView ss1,ss2,ss3,likebtn,dislikebtn;
        int check = 0, tempid = 0;

    }
}
Tushar kalsara
  • 59
  • 1
  • 1
  • 5

1 Answers1

0

This is because of object reuse in your list view.

You can manage separate ArrayList or HashMap to maintain your likes.

And based on that you should update in your getView like this,

if([already selected]) {
   viewHolder.likebtn.setBackground([your selected drawable]);
} else {
   viewHolder.likebtn.setBackground([your non selected drawable]);
}
Muthukrishnan Rajendran
  • 11,122
  • 3
  • 31
  • 41
  • i tried to apply your solution but i am not understanding it properly. if you can edit my code then it will be very helpful – Tushar kalsara Aug 07 '17 at 06:23