View owner and custom list of view items shuffled when scrolling

I know there are many similar questions, but I cannot find the mistake I am making if anyone can help. I am trying to display values ​​in an array list as a chat format, but the elements of the array list are lost when scrolling

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

            final ViewHolder holder;
            if (convertView == null) {

                convertView = LayoutInflater.from(getActivity()).inflate(
                        R.layout.chat_row, parent, false);
                holder = new ViewHolder();
     holder.messageLeft = (TextView) convertView
                    .findViewById(R.id.leftBox);
            holder.messageRight = (TextView) convertView
                    .findViewById(R.id.rightBox);
      convertView.setTag(holder);

            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            try { if (snd_id.get(position).equalsIgnoreCase(appPref.getData("Uid"))) {
                holder.messageLeft.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
                holder.messageLeft.setVisibility(View.VISIBLE);
                holder.messageRight.setVisibility(View.GONE);
            } else {
                holder.messageRight.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
                holder.messageRight.setVisibility(View.VISIBLE);
                holder.messageLeft.setVisibility(View.GONE);
            }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return convertView;

        }

here is the view class class

private static class ViewHolder {
        public TextView messageLeft;
        public TextView messageRight;
    }
+4
source share
3 answers

Just turn holder.messageRight.setVisibility(View.GONE);and holder.messageLeft.setVisibility(View.GONE);in his statement if-else.

 try {
        if (snd_id.get(position).equalsIgnoreCase(appPref.getData("Uid"))) {
            holder.messageLeft.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
            holder.messageLeft.setVisibility(View.VISIBLE);
            holder.messageRight.setVisibility(View.GONE);
        } else {
            holder.messageRight.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
            holder.messageRight.setVisibility(View.VISIBLE);
            holder.messageLeft.setVisibility(View.GONE);
        }

Let me know if this works for you or not.

+4
source

You choose findViewByIdevery time .. ViewHoldernot so arranged ... Change your condition if-elselike this and try.

   if (convertView == null) {

        convertView = LayoutInflater.from(getActivity()).inflate(
                R.layout.chat_row, parent, false);
        holder = new ViewHolder();
        holder.messageLeft = (TextView) convertView
            .findViewById(R.id.leftBox);
        holder.messageRight = (TextView) convertView
            .findViewById(R.id.rightBox);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

And delete

 convertView.setTag(holder);

down below

+2
 @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        if (convertView == null) {

            convertView = LayoutInflater.from(getActivity()).inflate(
                    R.layout.chat_row, parent, false);
            holder = new ViewHolder();
 holder.messageLeft = (TextView) convertView
                .findViewById(R.id.leftBox);
        holder.messageRight = (TextView) convertView
                .findViewById(R.id.rightBox);
  convertView.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        try {
            if (snd_id.get(position).equalsIgnoreCase(appPref.getData("Uid"))) {
                holder.messageLeft.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
                holder.messageLeft.setVisibility(View.VISIBLE);
            } else {
                holder.messageRight.setText(snd_name.get(position)+":"+"\n"+chat.get(position));
                holder.messageRight.setVisibility(View.VISIBLE);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return convertView;

    }

This is an effective and correct approach to using the viewer.

+2
source

Source: https://habr.com/ru/post/1529753/


All Articles