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
相关产品推荐
相关产品推荐

