您的位置:首页 > 移动开发 > Android开发

android fragment中 ScrollView嵌套ListView以及切换时scrollView显示底部的解决

2016-12-08 16:28 337 查看
fragment中,布局使用了scrollView嵌套ListView,listView会只显示一项,解决的办法是手动计算高度

//解决ScrollView嵌套ListView只显示一行
public void setListViewHeightBasedOnChildren(ListView listView)
{
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null)
{
return;
}

int totalHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++)
{
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}


使用方法

setListViewHeightBasedOnChildren(listView);


这个方法应该放在setAdapter之后

第二个问题,使用上边的方法,ScrollView会显示在底部,可以通过下边代码实现

//scrollView 嵌套ListView,默认scrollView不在顶部, 滑动到顶部
new Handler().post(new Runnable()
{
@Override
public void run()
{
scrollview.fullScroll(ScrollView.FOCUS_UP);
}
});


addView完之后,不等于马上就会显示,而是在队列中等待处理,但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败应该通过handler在新线程中更新

或者可以使用

//scrollView 嵌套ListView,默认scrollView不在顶部, 滑动到顶部
new Handler().post(new Runnable()
{
@Override
public void run()
{
// scrollview.fullScroll(ScrollView.FOCUS_UP);
scrollview.scrollTo(0, 0);
}
});


显示的会快一些

如果由于滑动动画还在继续,scrollTo在执行后效果被滑动动画覆盖,没起作用,可以试试

//scrollView 嵌套ListView,默认scrollView不在顶部, 滑动到顶部
new Handler().post(new Runnable()
{
@Override
public void run()
{
// scrollview.fullScroll(ScrollView.FOCUS_UP);
scrollview.scrollTo(0, 0);
scrollview.smoothScrollTo(0, 0);
}
});


smoothScrollTo()方法可以打断动画,将 scrollTo()换成smoothScrollTo()方法可正常定位位置

第三个问题,每次切换Fragment,ScrollView会跳转到底部,应该返回到上次停留的位置。思路就是切换fragment时,记录离开时的位置,切换回来以后,滚到到上次的位置

如果是通过hide和show控制fragment切换,使用onHiddenChanged

/**
* fragment hide or show
* true means hide else false
*/
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
}


如果是fragment结合viewpager使用时 使用setUserVisibleHint,onHiddenChanged应该不会调用

我实现的是在setUserVisibleHint中,代码

//ScrollView滑动位置
private int scrollY = 0;
private int scrollX = 0;
...

@Override
public void setUserVisibleHint(boolean isVisibleToUser)
{
super.setUserVisibleHint(isVisibleToUser);
/**
* 切换fragment,ScrollView总是滑动到底部
* 记录上一次滑动位置,切换到本界面,滑动到上次的位置
*/
if (scrollview != null)
{
if (isVisibleToUser)
{//当fragment从隐藏到出现的时候
scrollview.post(new Runnable()
{

@Override

public void run()
{

// TODO Auto-generated method stub

scrollview.scrollTo(scrollX, scrollY);

}

});

}
else
{
scrollX = scrollview.getScrollX();
scrollY = scrollview.getScrollY();
}
}
}


参考文章

fragment setUserVisibleHint onHiddenChanged方法

Android 控制ScrollView滚动到底部

四种方案解决ScrollView嵌套ListView问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐