滚动后,回收站视图重排错误

时间:2020-08-18 10:28:05

标签: java android android-studio android-recyclerview

如果我在回收站视图上滚动,则会中继错误的某些布局,这些布局不应该存在。 我在Google上进行了搜索,发现了以下信息:RecyclerView adapter showing wrong images,但对于我的代码却不起作用,我也发表了自己的信息。请帮助 我谢谢你!

MessageAdpater类:

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder>
{
    public static final int MSG_TYPE_LEFT = 0;
    public static final int MSG_TYPE_RIGHT = 1;

    private Context context;
    public static List<Chat> chats;
    private String senderName;

    private StringBuilder stringBuilder;

    private int i, stringLenght;
    private String string, strings;

    public static boolean[] longClick;
    public static long clickedMessages = 0;
    public static ViewHolder viewHolder;

    public static int position;
    public static Chat chat;

    public RecyclerView messageRecycler;

    private FirebaseUser user;

    public MessageAdapter(Context context, List<Chat> chats)
    {
        this.context = context;
        this.chats = chats;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        if (viewType == MSG_TYPE_RIGHT)
        {
            View view = LayoutInflater.from(context).inflate(R.layout.chat_item_right, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }
        else
        {
            View view = LayoutInflater.from(context).inflate(R.layout.chat_item_left, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position)
    {
        final Chat chat = chats.get(position);
        longClick = new boolean[chats.size()];

        MessageAdapter.position = position;
        MessageAdapter.chat = chat;
        viewHolder = holder;

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        rootRef.child("Users").child(chat.getSender()).addValueEventListener(new ValueEventListener()
        {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {
                senderName = String.valueOf(dataSnapshot.child("name").getValue());
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {}
        });


        holder.username.setText(senderName);

        if (chat.getAnswered().equals("true"))
        {
            holder.AnsweredBackground.setVisibility(View.VISIBLE);
            holder.answered.setText(chat.getAnsweredMessage());
            holder.answeredFrom.setText(chat.getAnsweredMessageFrom());
        }

        if (chat.getEdited().equals("true"))
        {
            holder.edited.setVisibility(View.VISIBLE);
        }
        else
        {
            holder.edited.setVisibility(View.GONE);
        }

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v)
            {
                if (longClick != null)
                {
                    if (!longClick[position])
                    {
                        holder.markedMessage.setVisibility(View.VISIBLE);
                        longClick[position] = true;
                        clickedMessages++;
                    }
                }
                else
                {
                    longClick = new boolean[chats.size()];
                    holder.markedMessage.setVisibility(View.VISIBLE);
                    longClick[position] = true;
                    clickedMessages++;
                }
                return true;
            }
        });

        holder.itemView.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (longClick != null)
                {
                    if (!longClick[position])
                    {
                        holder.markedMessage.setVisibility(View.VISIBLE);
                        longClick[position] = true;
                        clickedMessages++;
                    }
                    else if (longClick[position])
                    {
                        holder.markedMessage.setVisibility(View.GONE);
                        longClick[position] = false;
                        clickedMessages--;
                    }
                }
                else
                {
                    longClick = new boolean[chats.size()];
                    holder.markedMessage.setVisibility(View.VISIBLE);
                    longClick[position] = true;
                    clickedMessages++;
                }
            }
        });

        stringLenght = chat.getMessage().length();
        new DecriptMessagesClass(chat.getMessage(), stringLenght, position, chats, holder);
    }

    @Override
    public int getItemCount()
    {
        return chats.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder
    {
        public TextView answered;
        public TextView answeredFrom;
        public TextView messageView;
        public TextView username;
        public ImageView markedMessage;
        public RelativeLayout AnsweredBackground;
        public TextView edited;

        public ViewHolder(@NonNull View itemView)
        {
            super(itemView);

            answered = itemView.findViewById(R.id.AnsweredMessage);
            markedMessage = itemView.findViewById(R.id.marked_message);
            messageView = itemView.findViewById(R.id.message_view);
            answeredFrom = itemView.findViewById(R.id.answeredFrom);
            AnsweredBackground = itemView.findViewById(R.id.AnsweredMessageBackground);
            username = itemView.findViewById(R.id.message_sender_name);
            edited = itemView.findViewById(R.id.edited);
            messageRecycler = itemView.findViewById(R.id.messageView);
        }
    }

    @Override
    public int getItemViewType(int position)
    {
        user = FirebaseAuth.getInstance().getCurrentUser();
        if (chats.get(position).getSender().equals(user.getUid()))
        {
            return MSG_TYPE_RIGHT;
        }
        else
        {
            return MSG_TYPE_LEFT;
        }
    }
}

0 个答案:

没有答案