最近项目中遇到一个问题,和大家分享一下:
描述:
结构:我在FragmentA中有一个ScrollView,里面包含了一个ListView, ListView的每一条Item又都是一个ListView。
场景:当FragmentA跳转到FragmentB时加入到回退栈,返回FragmentA时吐栈,此时出现了ListView不停的在刷新
系统打印日志:
W/View﹕ requestLayout() improperly called by android.widget.ListView{358e8a3 VFED..C. ......ID 0,71-800,338 #7f0d0390 app:id/item_fusion_package_listview} during layout: running second layout pass
解决办法:在FragmentA中重写onHiddenChanged方法并在里面通知数据更新
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden){//解决吐栈回到fragment时 listview不停的重绘问题
if (adpter != null){
adpter.notifyDataSetChanged();
}
}
}
public class ListViewForScrollViewUtil {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}