首页 > 解决方案 > Recyclerview 没有显示两个值

问题描述

我正在尝试在 Recyclerview 中显示我通过 Json 从服务器检索的消息。我现在遇到的问题是;它不显示两条消息(已接收和已发送)。

只有当我注释掉um.setM_msg(jsonObject.getString("my_msg"));holder.m_msg.setText(mData.get(position).getM_msg());OR 另一个时它才会显示,它会显示但不会同时显示。

这是一些布局问题吗?想得到一些建议,提前谢谢。

检索数据并设置适配器

                JSONArray jsonArray=new JSONArray(response);
                for(int i=0;i<jsonArray.length();i++) {
                    try {
                        JSONObject jsonObject = jsonArray.getJSONObject(i);
                        messages um = new messages();
                        um.setS_msg(jsonObject.getString("s_msg"));
                        um.setM_msg(jsonObject.getString("my_msg"));
                        lstMessages.add(um);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }catch (JSONException e2){
                e2.printStackTrace();
            }
            rv_msg.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            chat myadapter = new chat(this, lstMessages);
            rv_msg.setAdapter(myadapter);

适配器类

public class chat extends RecyclerView.Adapter<chat.MyViewHolder> {

    public Context mContext;
    public static List<messages> mData;
    RequestOptions option;

    private static final int SENDER_LAY = 0;
    private static final int MY_LAY = 1;

    public chat(Context mContext, List<messages> mData) {
        this.mContext = mContext;
        this.mData = mData;

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view =null;
        MyViewHolder viewHolder = null;

        if(viewType==SENDER_LAY)
        {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_row_left_item,parent,false);
            viewHolder = new MyViewHolder(view);
        }
        else
        {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_row_right_item,parent,false);
            viewHolder= new MyViewHolder(view);
        }

        return viewHolder;
    }

    @Override
    public int getItemViewType(int position) {
        if (mData.get(position).getS_msg() != null && mData.get(position).getS_msg().length() > 0){
            return SENDER_LAY;
        } if (mData.get(position).getM_msg() != null && mData.get(position).getM_msg().length() > 0){
            return MY_LAY;
        } else {
            return MY_LAY; //temp
        }
    }


    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.s_msg.setText(mData.get(position).getS_msg());
        //holder.m_msg.setText(mData.get(position).getM_msg());
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView s_msg, m_msg;

        public MyViewHolder(View itemView) {
            super(itemView);
            m_msg = itemView.findViewById(R.id.m_msg);
            s_msg = itemView.findViewById(R.id.s_msg);

        }
    }
}

两个 XMl 看起来都像这样 (chat_row_left_item & chat_row_right_item)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="5dp"
    android:layout_marginStart="5dp"
    android:id="@+id/container">

    <com.google.android.material.card.MaterialCardView
        android:backgroundTint="@color/white"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:cardCornerRadius="5dp"
        >

        <TextView
            android:padding="5dp"
            android:visibility="visible"
            android:id="@+id/s_msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:textSize="18sp"
            android:textColor="@color/black"
            android:background="@color/white"/>


    </com.google.android.material.card.MaterialCardView>

</LinearLayout>

标签: androidandroid-recyclerview

解决方案


如果在 getItemViewType 覆盖函数中,则需要使用 else。

@Override
public int getItemViewType(int position) {
    if (mData.get(position).getS_msg() != null && mData.get(position).getS_msg().length() > 0){
        return SENDER_LAY;
    }else if (mData.get(position).getM_msg() != null && mData.get(position).getM_msg().length() > 0){
        return MY_LAY;
    } else {
        return MY_LAY; //temp
    }
}

推荐阅读