MP LineChart在ExpandableHeightListView中超过5项后尺寸丢失问题求助
问题修复方案
核心根因
代码里有两处致命逻辑错误,加上嵌套滚动场景的测量冲突共同导致了图表尺寸异常:
- 你将
ViewHolder声明为了适配器的全局成员变量,所有列表项共用同一个ViewHolder实例,当条目数超过ListView默认缓存阈值(通常为5)后,后续条目的ViewHolder会覆盖前面条目的引用,导致前序条目图表配置错乱。 LineDataSet被声明为static静态变量,所有条目共享同一个数据集实例,后续条目的数据修改会覆盖所有前面条目的数据集配置。- MPAndroidChart设置数据后没有主动触发刷新,无法重新测量绘制正确尺寸。
- 列表项中的LineChart如果使用wrap_content高度,在ScrollView嵌套ListView的场景下测量逻辑冲突,无法获取正确高度。
- 自定义的ExpandableHeightListView没有主动开启展开模式。
具体修改步骤
1. 修复ViewHolder全局声明问题
删掉适配器中全局的ViewHolder声明,将其改为getView方法内的局部变量:
// 删除这行全局声明 // private ViewHolder holder; @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; // 改为方法内局部变量 if (convertView == null) { convertView = mInflater.inflate(R.layout.most_active_stocks_listitem, null); holder = new ViewHolder(); holder.moverSymbolName = (TextView) convertView.findViewById(R.id.moversymbolName); // 其余找控件的代码保持不变 convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 后续逻辑保持不变 }
2. 移除LineDataSet的static修饰
// 把static删掉 private LineDataSet set1;
也可以直接把set1变量放到setData方法内作为局部变量使用,无需声明为类成员。
3. 给LineChart添加刷新逻辑
在setData方法末尾给LineChart设置完数据后,添加两行刷新代码:
holder.masLineChart.setData(data); // 新增以下两行 holder.masLineChart.notifyDataSetChanged(); holder.masLineChart.invalidate();
4. 给LineChart设置固定高度
修改列表项布局most_active_stocks_listitem.xml中LineChart的高度配置,不要用wrap_content,设置为固定dp值:
<com.github.mikephil.charting.charts.LineChart android:id="@+id/moversgraph" android:layout_width="match_parent" android:layout_height="120dp" />
可根据实际需求调整高度数值。
5. 开启ListView的展开模式
在Fragment中初始化ListView的代码里,主动调用setExpanded方法开启展开:
ExpandableHeightListView moverList = view.findViewById(R.id.moverlist); moverList.setExpanded(true); // 设置适配器之后额外调用一次请求布局 moverList.setAdapter(adapter); moverList.requestLayout();
内容的提问来源于stack exchange,提问作者AYESHA SIDDIQUI
相关产品推荐
相关产品推荐

