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

Java中RecyclerView能否传递int值?崩溃问题求解

问题解答

可以在RecyclerView中使用int类型的sno,应用崩溃的根本原因不是int类型本身,而是调用TextView.setText(int)时,系统会把这个int当作字符串资源ID去查找,而非直接显示数字,找不到对应资源就会抛出Resources.NotFoundException导致崩溃。

下面是具体修复操作:

1. 修正TextView的赋值逻辑

要显示int类型的数字,只需将其转换为字符串即可,常用方式有三种:

  • 使用String.valueOf()转换:textView.setText(String.valueOf(数字))
  • 拼接空字符串:textView.setText(数字 + "")
  • 使用Integer.toString()转换:textView.setText(Integer.toString(数字))

2. 修复Adapter的ViewHolder设计问题

你的Adapter存在核心错误:将textView2、textView3定义为Adapter全局变量,这会导致列表复用出现显示混乱。正确做法是把所有需要复用的View都放在ViewHolder内部,在onBindViewHolder中通过ViewHolder获取对应View。

保持原Contact类不变(无需修改,继续用int类型的sno)

public class Contact
{
    public int sno;
    public String phone;
    public String name;

    Contact(int sno, String phone, String name)
    {
        this.sno = sno;
        this.phone = phone;
        this.name = name;
    }
}

修改后的CustomAdapter类

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder>
{
    private final Contact[] localDataSet;

    /**
     * 自定义ViewHolder,管理列表项的所有View
     */
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView textView; // 对应sno的TextView
        private final TextView textView2; // 对应name的TextView
        private final TextView textView3; // 对应phone的TextView

        public ViewHolder(View view) {
            super(view);
            // 初始化当前列表项的所有View
            textView = view.findViewById(R.id.textView);
            textView2 = view.findViewById(R.id.textView2);
            textView3 = view.findViewById(R.id.textView3);
        }

        public TextView getTextView() {
            return textView;
        }

        public TextView getTextView2() {
            return textView2;
        }

        public TextView getTextView3() {
            return textView3;
        }
    }

    /**
     * 初始化Adapter数据集
     */
    public CustomAdapter(Contact[] dataSet) {
        localDataSet = dataSet;
    }

    // 创建新的列表项视图
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        View view = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.contact_layout, viewGroup, false);
        return new ViewHolder(view);
    }

    // 绑定数据到列表项
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, final int position)
    {
        // 将int类型的sno转为字符串后设置
        viewHolder.getTextView().setText(String.valueOf(localDataSet[position].sno));
        viewHolder.getTextView2().setText(localDataSet[position].name);
        viewHolder.getTextView3().setText(localDataSet[position].phone);
    }

    // 必须实现的方法:返回列表项总数
    @Override
    public int getItemCount() {
        return localDataSet.length;
    }
}

关键注意点

  • 永远不要在Adapter中定义全局View变量,必须通过ViewHolder管理每个列表项的View,这是RecyclerView复用机制的核心要求,否则会出现滚动时内容错乱的问题。
  • setText(int)方法的设计初衷是加载字符串资源(比如R.string.app_name),如果要显示普通数字,必须先转为字符串类型。

内容的提问来源于stack exchange,提问作者Dhruv Varia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:50:17