android fragment中 ScrollView嵌套ListView以及切换时scrollView显示底部的解决
2016-12-08 16:28
337 查看
fragment中,布局使用了scrollView嵌套ListView,listView会只显示一项,解决的办法是手动计算高度
使用方法
这个方法应该放在setAdapter之后
第二个问题,使用上边的方法,ScrollView会显示在底部,可以通过下边代码实现
addView完之后,不等于马上就会显示,而是在队列中等待处理,但是如果立即调用fullScroll, view可能还没有显示出来,所以会失败应该通过handler在新线程中更新
或者可以使用
显示的会快一些
如果由于滑动动画还在继续,scrollTo在执行后效果被滑动动画覆盖,没起作用,可以试试
smoothScrollTo()方法可以打断动画,将 scrollTo()换成smoothScrollTo()方法可正常定位位置
第三个问题,每次切换Fragment,ScrollView会跳转到底部,应该返回到上次停留的位置。思路就是切换fragment时,记录离开时的位置,切换回来以后,滚到到上次的位置
如果是通过hide和show控制fragment切换,使用onHiddenChanged
如果是fragment结合viewpager使用时 使用setUserVisibleHint,onHiddenChanged应该不会调用
我实现的是在setUserVisibleHint中,代码
参考文章
fragment setUserVisibleHint onHiddenChanged方法
Android 控制ScrollView滚动到底部
四种方案解决ScrollView嵌套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问题
相关文章推荐
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android 6.0+ RecyclerView嵌套在ScrollView显示不全以及Android 7.0+ PopupWindow位置显示不对的问题解决
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- 【转】Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Fragment 实现android项目主流APP Tab (微博,今日头条等等),解决横竖屏切换重叠,以及切换回调。
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- Android开发中关于如何解决Fragment中弹出键盘会把底部菜单栏顶上去的问题以及返回键的监听问题