You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:09:03