Recyclerview не показывает оба значения

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я пытаюсь отобразить сообщения внутри Recyclerview, которые я получаю с сервера через Json. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что он не показывает оба сообщения (полученные и отправленные).

Он отображается только в том случае, если я закомментирую um.setM_msg(jsonObject.getString("my_msg")); и holder.m_msg.setText(mData.get(position).getM_msg()); ИЛИ другое, и оно появится, но не оба одновременно.

Это какая-то проблема с макетом? хотел бы получить несколько советов, заранее спасибо.

Извлечение данных и настройка адаптера

                 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 amp;amp; mData.get(position).getS_msg().length() > 0){
            return SENDER_LAY;
        } if (mData.get(position).getM_msg() != null amp;amp; 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>
  

Ответ №1:

вам нужно использовать else, если у вас есть функция переопределения getItemViewType.

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