RecyclerView仅显示联系人最后一个手机号问题求助
解决RecyclerView联系人多手机号仅显示最后一个的问题
看起来你已经搞定了数据获取的部分(毕竟Logcat能打出所有手机号),问题出在RecyclerView的Item展示逻辑上——每次绑定视图时都把之前的手机号覆盖了,只留下最后一个。我给你两个靠谱的解决方案,你可以根据需求选择:
方案一:拼接手机号为字符串,用单个TextView展示
这种方法简单直接,适合不需要复杂样式的场景,把所有手机号用换行或分隔符拼接后,设置到一个支持自动换行的TextView里。
步骤1:确保实体类存储所有手机号
先确认你的联系人实体类里有一个集合字段保存所有手机号,比如:
public class Contact { private String contactName; private List<String> phoneNumbers; // 存储该联系人的所有手机号 // Getter和Setter方法 public String getContactName() { return contactName; } public void setContactName(String contactName) { this.contactName = contactName; } public List<String> getPhoneNumbers() { return phoneNumbers; } public void setPhoneNumbers(List<String> phoneNumbers) { this.phoneNumbers = phoneNumbers; } }
步骤2:修改Item布局的TextView
给手机号的TextView设置允许自动换行,避免内容被截断:
<TextView android:id="@+id/tv_phone_numbers" android:layout_width="match_parent" android:layout_height="wrap_content" android:lines="0" <!-- 让TextView自动适应多行内容 --> android:layout_marginTop="6dp" android:textSize="14sp"/>
步骤3:在Adapter中拼接手机号
在onBindViewHolder里把所有手机号用换行符拼接,设置到TextView:
@Override public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) { Contact currentContact = contactList.get(position); holder.tvContactName.setText(currentContact.getContactName()); // 用换行符拼接所有手机号,TextUtils.join会自动处理空集合情况 String allPhones = TextUtils.join("\n", currentContact.getPhoneNumbers()); holder.tvPhoneNumbers.setText(allPhones); } // ViewHolder定义 static class ContactViewHolder extends RecyclerView.ViewHolder { TextView tvContactName; TextView tvPhoneNumbers; public ContactViewHolder(@NonNull View itemView) { super(itemView); tvContactName = itemView.findViewById(R.id.tv_contact_name); tvPhoneNumbers = itemView.findViewById(R.id.tv_phone_numbers); } }
方案二:动态添加视图,每个手机号单独展示
如果需要给每个手机号加单独的样式(比如不同颜色、图标),可以用一个容器(比如LinearLayout)动态添加TextView来展示每个号码。
步骤1:修改Item布局,添加容器
在Item布局里加一个垂直方向的LinearLayout作为手机号的容器:
<LinearLayout android:id="@+id/ll_phone_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginTop="6dp"/>
步骤2:在Adapter中动态添加手机号视图
注意一定要先清空容器,避免RecyclerView复用ViewHolder时残留旧数据:
@Override public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) { Contact currentContact = contactList.get(position); holder.tvContactName.setText(currentContact.getContactName()); // 清空容器,防止复用ViewHolder时显示之前的手机号 holder.llPhoneContainer.removeAllViews(); // 遍历所有手机号,逐个添加TextView for (String phone : currentContact.getPhoneNumbers()) { TextView phoneTv = new TextView(holder.itemView.getContext()); phoneTv.setText(phone); // 可以自定义样式,比如字体大小、间距 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); params.topMargin = 4; // 每个手机号之间的间距 phoneTv.setLayoutParams(params); phoneTv.setTextSize(14sp); holder.llPhoneContainer.addView(phoneTv); } } // ViewHolder定义 static class ContactViewHolder extends RecyclerView.ViewHolder { TextView tvContactName; LinearLayout llPhoneContainer; public ContactViewHolder(@NonNull View itemView) { super(itemView); tvContactName = itemView.findViewById(R.id.tv_contact_name); llPhoneContainer = itemView.findViewById(R.id.ll_phone_container); } }
这两种方法都能解决你的问题,方案一适合快速实现,方案二更灵活。你可以根据自己的UI需求来选~
内容的提问来源于stack exchange,提问作者Code Poet
相关产品推荐
相关产品推荐

