RecyclerView数据传递成功但无法渲染问题求助
RecyclerView数据传递正常但无法渲染的问题排查
开发RecyclerView功能时,现有两个Activity:Activity A包含RecyclerView,Activity B包含两个EditText组件。给Activity B中的按钮设置OnClickListener,将EditText输入数据存入MainData对象并添加至ArrayList,传递给Activity A的Adapter。数据传递正常,但RecyclerView无法渲染加载,以下是相关代码及问题排查:
包含RecyclerView的Activity A代码
recyclerView = (RecyclerView) findViewById(R.id.rv); linearLayoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(linearLayoutManager); ArrayList<MainData> list = (ArrayList<MainData>) getIntent().getSerializableExtra("list"); adapter = new MainAdapter(list); recyclerView.setAdapter(adapter); adapter.notifyDataSetChanged();
包含EditText的Activity B代码
Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LinearLayout itemView = (LinearLayout) findViewById(R.id.rv); Intent intent = new Intent(upload.this, MainActivity.class); ArrayList<MainData> list = new ArrayList<MainData>(); EditText edit = (EditText) findViewById(R.id.edittext_name); EditText edit_main = (EditText) findViewById(R.id.edittext_main); list.add(new MainData(edit.getText().toString(), edit_main.getText().toString())); intent.putExtra("list",list); startActivity(intent); } });
MainData代码
public MainData(String tv_name, String tv_content) { this.tv_name = tv_name; this.tv_content = tv_content; }
Adapter代码
private ArrayList<MainData> list; public MainAdapter(ArrayList<MainData> list) { this.list = list; } @NonNull @Override public MainAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false); CustomViewHolder holder = new CustomViewHolder(view); return holder; } @Override public void onBindViewHolder(@NonNull MainAdapter.CustomViewHolder holder, int position) { holder.tv_name.setText(list.get(position).getTv_name()); holder.tv_content.setText(list.get(position).getTv_content()); holder.itemView.setTag(position); @Override public int getItemCount() { return (null != list ? list.size() : 0); }
RecyclerView布局XML文件
<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbarFadeDuration="0" android:scrollbarSize="5dp" android:scrollbarThumbVertical="@color/black" android:scrollbars="vertical" android:layout_weight="1"/> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="8" android:text="move" android:textSize="30sp"/> </LinearLayout>
问题原因及修复方案
1. Adapter语法错误(核心问题)
Adapter代码中getItemCount()被错误嵌套在onBindViewHolder()方法内部,导致RecyclerView无法正确获取列表条目数;同时缺少CustomViewHolder定义,无法绑定列表项控件。
修复后的Adapter代码:
private ArrayList<MainData> list; public MainAdapter(ArrayList<MainData> list) { this.list = list; } @NonNull @Override public MainAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false); return new CustomViewHolder(view); } @Override public void onBindViewHolder(@NonNull MainAdapter.CustomViewHolder holder, int position) { holder.tv_name.setText(list.get(position).getTv_name()); holder.tv_content.setText(list.get(position).getTv_content()); holder.itemView.setTag(position); } @Override public int getItemCount() { return list != null ? list.size() : 0; } // 补充CustomViewHolder定义,需与item_list布局控件ID对应 public static class CustomViewHolder extends RecyclerView.ViewHolder { TextView tv_name; TextView tv_content; public CustomViewHolder(@NonNull View itemView) { super(itemView); tv_name = itemView.findViewById(R.id.tv_name); // 替换为item_list布局实际ID tv_content = itemView.findViewById(R.id.tv_content); // 替换为item_list布局实际ID } }
2. MainData未实现Serializable接口
通过getSerializableExtra()传递ArrayList时,泛型类MainData必须实现Serializable接口,否则会导致数据传递异常。
修复后的MainData代码:
import java.io.Serializable; public class MainData implements Serializable { private String tv_name; private String tv_content; public MainData(String tv_name, String tv_content) { this.tv_name = tv_name; this.tv_content = tv_content; } // 补充getter方法,供Adapter获取数据 public String getTv_name() { return tv_name; } public String getTv_content() { return tv_content; } }
3. Activity B中的无用错误代码
Activity B中LinearLayout itemView = (LinearLayout) findViewById(R.id.rv);无意义,且布局中不存在该控件,会引发空指针异常,直接删除即可。
4. RecyclerView布局权重设置错误
垂直方向LinearLayout中使用layout_weight时,需将控件layout_height设为0dp,否则权重不生效,RecyclerView会被Button挤压至不可见。
修复后的RecyclerView布局代码:
<?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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="0dp" android:scrollbarFadeDuration="0" android:scrollbarSize="5dp" android:scrollbarThumbVertical="@color/black" android:scrollbars="vertical" android:layout_weight="1"/> <Button android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="8" android:text="move" android:textSize="30sp"/> </LinearLayout>
内容的提问来源于stack exchange,提问作者Chanyoung
相关产品推荐
相关产品推荐

