Search code examples
androidclassobjectreplacenew-operator

Android: New object created from a class in android is getting replaced by old objects


This is my class

public class ListItem {
    private String title, subtitle;
    private int itemImageResourceId;

    public ListItem (String mtitle, String msubtitle, int mitemImageResourceId){
        title = mtitle;
        subtitle = msubtitle;
        itemImageResourceId = mitemImageResourceId;
    }

    public String gettitle() {
        return title;
    }

    public String getsubtitle() {
        return subtitle;
    }

    public int getitemImageResourceId() {
        return itemImageResourceId;
    }
}

and this is how I am creating my object and feeding it into an array list

ListItem myObject = new ListItem("Title 1", "Sub Title 1", R.drawable.img1);
ListItem myObject2 = new ListItem("Title 2", "Sub Title 2", R.drawable.img2);
ListItem myObject3 = new ListItem("Title 3", "Sub Title 4", R.drawable.img3);
ListItem myObject4 = new ListItem("Title 4", "Sub Title 4", R.drawable.img4);
ListItem myObject5 = new ListItem("Title 5", "Sub Title 5", R.drawable.img5);
ListItem myObject6 = new ListItem("Title 6", "Sub Title 6", R.drawable.img1);
ListItem myObject7 = new ListItem("Title 7", "Sub Title 7", R.drawable.img2);
ListItem myObject8 = new ListItem("Title 8", "Sub Title 8", R.drawable.img4);
ListItem myObject9 = new ListItem("Title 9", "Sub Title 9", R.drawable.img5);
ArrayList<ListItem> mylistview = new ArrayList<ListItem>(
Arrays.asList(myObject, myObject2, myObject3, myObject4, myObject5, myObject6, myObject7, myObject8, myObject9));

but every time I run the code, the 9th item on the displayed list view display the values for the first item. I don;t know why is the New object created from this class getting replaced by old objects? Someone please help I have been trying to fix this for 6 hours.

adapter code

public class MyListView extends ArrayAdapter<ListItem> {
    //private static final String LOG_TAG = ListItem.class.getSimpleName();
    Context mContext;
    int mResource;
    ArrayList<ListItem> mobjects;

    public MyListView(Context context, int resource, ArrayList<ListItem> objects) {
        super(context, resource, objects);
        mContext = context;
        mResource = resource;
        mobjects = objects;
    }
    public static class ViewHolder{
        RelativeLayout _layout;
        ImageView _selicon;
        TextView _seltitle;
        TextView _selsubtitle;
        ImageButton _selimgbutton;
    }

    public View getView(int position, View view, ViewGroup parent) {
        View listItemView = view;
        final ViewHolder holder;
        if(listItemView == null) {
            LayoutInflater inflater = LayoutInflater.from(mContext);
            listItemView = inflater.inflate(mResource, parent,false);
            holder = new ViewHolder();
            holder._layout = listItemView.findViewById(R.layout.my_list);

            ListItem currentitem = getItem(position);

            holder._selicon = listItemView.findViewById(R.id.icon);
            holder._seltitle = listItemView.findViewById(R.id.title);
            holder._selsubtitle = listItemView.findViewById(R.id.subtitle);
            holder._selimgbutton = listItemView.findViewById(R.id.imgbutton);

            holder._seltitle.setText(currentitem.gettitle());
            holder._selicon.setImageResource(currentitem.getitemImageResourceId());
            holder._selsubtitle.setText(currentitem.getsubtitle());

            holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
                    PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
                    popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());

                    popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                        public boolean onMenuItemClick(MenuItem item) {
                            if (item.getTitle().equals("Good")) {
                                Toast.makeText(mContext, "You Clicked Good: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                            }else if (item.getTitle().equals("Bad")){
                                Toast.makeText(mContext, "You Clicked Bad: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                            }else {
                                return onMenuItemClick(item);
                            }
                            return true;
                        }
                    });

                    popup.show();
                }
            });
            listItemView.setTag(holder);
        }else{
            holder = (ViewHolder) listItemView.getTag();
        }

        return listItemView;
    }

}

Solution

  • You've forgotten to set holder values in case when it's taken from tag:

    public View getView(int position, View view, ViewGroup parent) {
            View listItemView = view;
            final ViewHolder holder;
            final ListItem currentitem = getItem(position);
    
            if (listItemView == null) {
                LayoutInflater inflater = LayoutInflater.from(mContext);
                listItemView = inflater.inflate(mResource, parent,false);
                holder = new ViewHolder();
                holder._layout = listItemView.findViewById(R.layout.my_list);
    
                
    
                holder._selicon = listItemView.findViewById(R.id.icon);
                holder._seltitle = listItemView.findViewById(R.id.title);
                holder._selsubtitle = listItemView.findViewById(R.id.subtitle);
                holder._selimgbutton = listItemView.findViewById(R.id.imgbutton);
    
                holder._seltitle.setText(currentitem.gettitle());
                holder._selicon.setImageResource(currentitem.getitemImageResourceId());
                holder._selsubtitle.setText(currentitem.getsubtitle());
    
                holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
                        PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
                        popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
    
                        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                            public boolean onMenuItemClick(MenuItem item) {
                                if (item.getTitle().equals("Good")) {
                                    Toast.makeText(mContext, "You Clicked Good: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                                }else if (item.getTitle().equals("Bad")){
                                    Toast.makeText(mContext, "You Clicked Bad: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                                }else {
                                    return onMenuItemClick(item);
                                }
                                return true;
                            }
                        });
    
                        popup.show();
                    }
                });
                listItemView.setTag(holder);
            } else {
                holder = (ViewHolder) listItemView.getTag();
                holder._seltitle.setText(currentitem.gettitle());
                holder._selicon.setImageResource(currentitem.getitemImageResourceId());
                holder._selsubtitle.setText(currentitem.getsubtitle());
    
                holder._selimgbutton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //Toast.makeText(mContext, holder._seltitle.getText().toString(), Toast.LENGTH_SHORT).show();
                        PopupMenu popup = new PopupMenu(mContext, holder._selimgbutton);
                        popup.getMenuInflater().inflate(R.menu.poupup_menu, popup.getMenu());
    
                        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                            public boolean onMenuItemClick(MenuItem item) {
                                if (item.getTitle().equals("Good")) {
                                    Toast.makeText(mContext, "You Clicked Good: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                                }else if (item.getTitle().equals("Bad")){
                                    Toast.makeText(mContext, "You Clicked Bad: " + holder._seltitle.getText(), Toast.LENGTH_SHORT).show();
                                }else {
                                    return onMenuItemClick(item);
                                }
                                return true;
                            }
                        });
    
                        popup.show();
                    }
                });
            }
    
            return listItemView;
        }