android - 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>
解决方案
如果在 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
}
}
推荐阅读
- android - 在 MediaControllerCompat.TransportControls 中正确设置重复/随机播放选项
- python - 蝗虫中的动态GET参数
- r - 有没有人成功使用 Matomo 通过闪亮仪表板应用程序进行闪亮使用跟踪?
- matlab - 如何在matlab中将图像扭曲到3D平面
- animation - 有没有办法在 UWP 中转储表达式动画值?
- selenium - 5
我无法从代码中获取动态文本“5”。当我使用 gettext() 得到 0 而不是 5
<span _ngcontent-c3="" xpath="1">5</span>
我试过 xpath =
"//div[4]//div[1]//div[2]//div[1]//p[3]//span[2]"
- python - 从 python 中的 SpooledTemporaryFile 中检索文件名
- c# - 我怎样才能避免循环遍历相同的数据
- c++ - 只读位置 '__result.std::_Rb_tree_const_iterator<_Tp>::operator* 的错误分配
()' - javascript - 如何在 Node.js 中使用 Azure Function App 访问 Azure AD