RecyclerView显示多GraphView图表异常:蓝牙传感器数据复用问题排查
嘿,我一眼就看出问题出在哪了!你现在所有图表显示相同数据的核心原因,是你初始化dataSeriesList的时候犯了一个常见的引用复用错误——你把同一个initSeries对象重复添加了6次到列表里,列表里的6个元素其实全是指向同一个PointsGraphSeries实例的引用!
为什么会这样?
Arrays.asList(initSeries, initSeries, initSeries, initSeries, initSeries, initSeries)这个写法,并不会帮你创建6个独立的series对象,它只是把同一个initSeries的引用复制了6份放进列表。你以为是6个独立的series,但实际上它们都是同一个对象的“别名”——不管你调用dataSeriesList.get(position).appendData()时选哪个位置,最终都是在修改同一个series,自然所有图表都会显示一模一样的数据。
怎么修复?
你需要为每个图表创建独立的series实例,而不是复用同一个对象。具体步骤如下:
修改列表初始化逻辑
不要直接用Arrays.asList复用同一个对象,而是通过循环创建6个全新的series:private List<PointsGraphSeries<DataPoint>> dataSeriesList = new ArrayList<>(); // 在初始化代码里(比如Activity的onCreate、Fragment的onViewCreated,或者Adapter的构造方法中) for (int i = 0; i < 6; i++) { // 每次循环都生成一个新的series,带初始虚拟数据 PointsGraphSeries<DataPoint> newSeries = createInitSeries(); dataSeriesList.add(newSeries); }封装单个series的初始化逻辑
把你原来初始化initSeries的代码改成一个方法,每次调用都返回一个全新的series实例:private PointsGraphSeries<DataPoint> createInitSeries() { // 这里写你原来给initSeries设置虚拟数据的逻辑 PointsGraphSeries<DataPoint> series = new PointsGraphSeries<>(); // 比如添加初始的虚拟数据点 series.appendData(new DataPoint(0, 0), true, 40); // ...其他初始化配置(比如颜色、样式等) return series; }保留原有的
onBindViewHolder逻辑
现在列表里的每个series都是独立对象了,你原来在onBindViewHolder里的代码可以正常工作:public void onBindViewHolder(@NonNull ProductCardViewHolder holder, int position) { // ...其他代码 // 为当前位置的独立series追加新数据 dataSeriesList.get(position).appendData(newReading, true, 40); // 仅为图表设置一次series if (holder.graph.getSeries().size() == 0) { holder.graph.addSeries(dataSeriesList.get(position)); } // ...其他代码 }
验证方法
你可以在初始化完dataSeriesList后,打印每个元素的哈希值:
for (int i = 0; i < dataSeriesList.size(); i++) { Log.d("SeriesCheck", "Series " + i + " hash: " + dataSeriesList.get(i).hashCode()); }
如果输出的6个哈希值各不相同,就说明每个series都是独立的对象,问题已经解决啦!
内容的提问来源于stack exchange,提问作者t020608

