RecyclerView无数据显示:跨Activity传递列表数据失败排查
问题根源与解决方案
你遇到的核心问题是错误地通过实例化SerieActivity来获取数据——每次new SerieActivity()都会创建一个全新的Activity实例,它的mList是刚初始化的空列表(或者默认填充的测试数据),和用户实际操作的那个SerieActivity实例完全无关,这就导致Result页面拿到的始终是无效数据。
下面是完整的修复方案:
步骤1:让Variable类实现Parcelable接口
要跨Activity传递自定义对象列表,必须让对象实现Parcelable(Android推荐的高效序列化方式):
public class Variable implements Parcelable { boolean known; String unit, name; double value; // 原构造方法 public Variable(boolean known, String unit, String name, double value) { this.known = known; this.unit = unit; this.name = name; this.value = value; } // Parcelable 反序列化构造方法 protected Variable(Parcel in) { known = in.readByte() != 0; // boolean转byte存储 unit = in.readString(); name = in.readString(); value = in.readDouble(); } // Parcelable 必要的Creator public static final Creator<Variable> CREATOR = new Creator<Variable>() { @Override public Variable createFromParcel(Parcel in) { return new Variable(in); } @Override public Variable[] newArray(int size) { return new Variable[size]; } }; // 序列化数据到Parcel @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByte((byte) (known ? 1 : 0)); dest.writeString(unit); dest.writeString(name); dest.writeDouble(value); } // 默认返回0即可(无特殊内容需要描述) @Override public int describeContents() { return 0; } // 补全getter方法(适配器需要调用) public boolean isKnown() { return known; } public String getUnit() { return unit; } public String getName() { return name; } public double getValue() { return value; } }
步骤2:在SerieActivity中通过Intent传递数据
修改跳转按钮的点击事件,把用户操作后的mList通过Intent传递给ResultActivity:
fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(SerieActivity.this, ResultActivity.class); intent.putExtra("tag", "serie"); // 传递Parcelable列表 intent.putParcelableArrayListExtra("variable_list", mList); startActivity(intent); } });
步骤3:在ResultActivity中接收数据并初始化RecyclerView
public class ResultActivity extends AppCompatActivity { private ArrayList<Variable> mResultList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_result); // 获取传递过来的列表 Intent intent = getIntent(); if (intent != null) { mResultList = intent.getParcelableArrayListExtra("variable_list"); } // 初始化RecyclerView RecyclerView recyclerView = findViewById(R.id.result_rv); // 防止空指针,若列表为空则初始化空列表 if (mResultList == null) { mResultList = new ArrayList<>(); } RVResultAdapter adapter = new RVResultAdapter(this, mResultList); recyclerView.setAdapter(adapter); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); } }
步骤4:完善RVResultAdapter的代码
你提供的适配器代码不完整,补全核心部分:
public class RVResultAdapter extends RecyclerView.Adapter<RVResultAdapter.ViewHolder> { private Context context; private ArrayList<Variable> variableList; public RVResultAdapter(Context context, ArrayList<Variable> variableList) { this.context = context; this.variableList = variableList; // 空列表容错 if (this.variableList == null) { this.variableList = new ArrayList<>(); } } @Override public RVResultAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.result_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(RVResultAdapter.ViewHolder holder, int position) { Variable v = variableList.get(position); holder.setItems(v); } @Override public int getItemCount() { return variableList.size(); } public class ViewHolder extends RecyclerView.ViewHolder { TextView nameTv; TextView valueTv; TextView unitTv; public ViewHolder(View itemView) { super(itemView); // 确保这里的ID和你的result_item布局一致 nameTv = itemView.findViewById(R.id.result_name_tv); valueTv = itemView.findViewById(R.id.result_value_tv); unitTv = itemView.findViewById(R.id.result_unit_tv); } public void setItems(Variable variable) { nameTv.setText(variable.getName()); valueTv.setText(String.format("%.3f", variable.getValue())); unitTv.setText(variable.getUnit()); } } }
关键注意点
- 永远不要实例化Activity来获取数据:每个Activity实例都是独立的,跳转后的新实例和之前的没有任何关联。
- 跨页面传递数据必须序列化:自定义对象必须实现
Parcelable或Serializable,Parcelable是Android官方推荐的高效方案。 - 空指针容错:处理Intent可能为空、列表可能为空的情况,避免崩溃。
内容的提问来源于stack exchange,提问作者Diana Vrabie
相关产品推荐
相关产品推荐

