#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
}
}