使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突
在项目中,我们常常会遇到一个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; i < listAdapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
因此,为了彻底解决问题,就需要我们另辟途径了,我们使用 LinearLayout 绑定 Adapter的方法来代替ListView
将 adapter 里面的 view 全部加入 LinearLayout 并设置回调监听,添加DataSetObserver监听adapter 的改变。
public class LinearLayoutForListView extends LinearLayout { private Adapter mAdapter; private OnItemClickListener mOnItemClickListener; private SparseArray<View> mViewHolders; private AdapterDataSetObserver mDataSetObserver; public OnItemClickListener getOnItemClickListener() { return mOnItemClickListener; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } public LinearLayoutForListView(Context context) { super(context); } public LinearLayoutForListView(Context context, AttributeSet attrs) { super(context, attrs); } public LinearLayoutForListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setAdapter(Adapter adapter) { this.mAdapter = adapter; bindLinearLayout(); } /** 绑定布局 */ private void bindLinearLayout() { if (mAdapter == null) { return; } setOrientation(LinearLayout.VERTICAL); int count = mAdapter.getCount(); this.removeAllViews(); mViewHolders = new SparseArray<View>(count); for (int i = 0; i < count; i++) { final View v = mAdapter.getView(i, null, null); final int tmp = i; final Object obj = mAdapter.getItem(i); mViewHolders.put(i,v); // view 点击事件触发时回调我们自己的接口 v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClicked(v, obj, tmp); } } }); addView(v); } } /** * * 回调接口 */ public interface OnItemClickListener { /** * @param v 点击的 view * @param obj 点击的 view 所绑定的对象 * @param position 点击位置的 index */ public void onItemClicked(View v, Object obj, int position); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if(mAdapter != null && mDataSetObserver == null){ mDataSetObserver = new AdapterDataSetObserver(); mAdapter.registerDataSetObserver(mDataSetObserver); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if(mAdapter != null && mDataSetObserver != null){ mAdapter.unregisterDataSetObserver(mDataSetObserver); } } private class AdapterDataSetObserver extends DataSetObserver { @Override public void onChanged() { if(mAdapter!=null){ final int count = mAdapter.getCount(); for (int i = 0; i < count; i++){ mAdapter.getView(i,mViewHolders.get(i,null),null); } requestLayout(); } } }}
调用
list.setAdapter(madapter);list.setOnItemClickListener(new LinearLayoutForListView.OnItemClickListener() { @Override public void onItemClicked(View v, Object obj, int position) { }});
转载于:https://www.cnblogs.com/lucktian/p/6478227.html
使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突相关推荐
- 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)
在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...
- android ScrollView滚动距离和判断滚动停止状态
今天很高兴,自己解决了判断ScrollView滚动停止的监听,现在分享给大家. 因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROL ...
- Android开发之解决ListView和ScrollView滑动冲突的方法
我们看下图: 不管怎么滑动都无法显示listview的剩余数据,只能显示一条,我们看下布局,ScrollView里面嵌套ListView <?xml version="1.0" ...
- Android之解决在scrollview中嵌套ListView切换界面时scrollview整体向下滑动
有时候我们在scrollview中会嵌套ListView,在嵌套ListView(ListView上面还有一些控件)后,切换Activity时会发现整个 scrollview 被向下滑动直到ListV ...
- 【Android】ListView、RecyclerView、ScrollView里嵌套ListView 相对优雅的解决方案:NestFullListView
一 背景概述: ScrollView里嵌套ListView,一直是Android开发者(反正至少是我们组)最讨厌的设计之一,完美打破ListView(RecyclerView)的复用机制,成功的将Na ...
- 解决ListView显示不全、滑动冲突问题
在开发中,ListView是使用得最多的控件,有时候会遇到ListView因为各种原因引起的数据显示不全,例如,嵌套了ScrollView等.这个解决的办法很多,这里记录一下我自己用过的方法, ...
- 解决viewpager+多个fragment+listview,listview展示内容高度不自适应出现多余空白问题
做项目遇到这个问题后,在网上搜了下,就找到两篇相关的,但是感觉写的有的乱,看起来不够清晰,所以整理了下完美解决这个问题,下面直接看代码. 一.重写viewpager import android.co ...
- Flutter ListView解决底部或顶部留白问题
Flutter ListView解决底部或顶部留白问题 在没有设置padding的情况下,上下都有留白 方法一: ListView.builder(padding: EdgeInsets.zero,i ...
- android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题
今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...
最新文章
- 微信 小程序布局 水平菜单
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
- X-Magic Pair gcd,剪枝(1600)
- sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
- java 并发编程总结
- vue v html安全,vue 中控制v-html 中的样式,但不影响全局的小技巧
- 【转】为了修复打码女神脸,他们提出二阶段生成对抗网络EdgeConnect
- Sharding-Proxy分库配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记020
- Linux 安装 OFFICE 2007
- Java 操作 HBase 教程
- 实验 VoIP通信的配置
- atan和atan2的区别-Matlab三角函数
- 精彩Linux 篇章
- easyexcel 导出数据锁定某个单元格
- 微信小程序学习并搭建
- 数据字典的作用是什么,它有哪些条目?
- Kubernetes上基于longhorn和statefulsets的pv空间扩展
- 深度学习领域专有名词的理解与释义
- 2022京东618预售一般多久才发货啊?几天能收到货?
- 2021-05-12 MongoDB面试题 “ObjectID“有哪些部分组成
热门文章
- 两个多项式相乘求解系数数组算法
- Console.Write(程序猿?开发?写代码?编程?移动、网页、桌面开发?Oh,我连菜鸟都不是!);...
- seo超强外部链接、内部链接技巧
- 通用的权限管理系统发布
- vue配置git的子模块
- 分享一个前后端分离的web项目(vue+spring boot)
- ROS(Robot Operating System)笔记 : 1.使用launch file在gazebo中生成urdf机器人
- vue中的data用return返回
- 【机器学习实战】极大似然法
- 在屏幕上打印杨辉三角