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

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());
        }
    }
}

关键注意点

  1. 永远不要实例化Activity来获取数据:每个Activity实例都是独立的,跳转后的新实例和之前的没有任何关联。
  2. 跨页面传递数据必须序列化:自定义对象必须实现Parcelable或Serializable,Parcelable是Android官方推荐的高效方案。
  3. 空指针容错:处理Intent可能为空、列表可能为空的情况,避免崩溃。

内容的提问来源于stack exchange,提问作者Diana Vrabie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:23