在项目中,我们常常会遇到一个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滚动冲突相关推荐

  1. 【Android 手势冲突】Colin带你彻底解决RecyclerView与ScrollView滑动冲突问题,并实现RecyclerView悬停导航栏(附demo哦)

    在新一期的需求中,产品要求我们做出和美团某个页面类似的功能,即一个页面包含在scrollView中,上面一个部分放置一些常用的广告banner.宫格tab等,下面放置一个RecyclerView用于展 ...

  2. android ScrollView滚动距离和判断滚动停止状态

    今天很高兴,自己解决了判断ScrollView滚动停止的监听,现在分享给大家. 因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROL ...

  3. Android开发之解决ListView和ScrollView滑动冲突的方法

    我们看下图: 不管怎么滑动都无法显示listview的剩余数据,只能显示一条,我们看下布局,ScrollView里面嵌套ListView <?xml version="1.0" ...

  4. Android之解决在scrollview中嵌套ListView切换界面时scrollview整体向下滑动

    有时候我们在scrollview中会嵌套ListView,在嵌套ListView(ListView上面还有一些控件)后,切换Activity时会发现整个 scrollview 被向下滑动直到ListV ...

  5. 【Android】ListView、RecyclerView、ScrollView里嵌套ListView 相对优雅的解决方案:NestFullListView

    一 背景概述: ScrollView里嵌套ListView,一直是Android开发者(反正至少是我们组)最讨厌的设计之一,完美打破ListView(RecyclerView)的复用机制,成功的将Na ...

  6. 解决ListView显示不全、滑动冲突问题

        在开发中,ListView是使用得最多的控件,有时候会遇到ListView因为各种原因引起的数据显示不全,例如,嵌套了ScrollView等.这个解决的办法很多,这里记录一下我自己用过的方法, ...

  7. 解决viewpager+多个fragment+listview,listview展示内容高度不自适应出现多余空白问题

    做项目遇到这个问题后,在网上搜了下,就找到两篇相关的,但是感觉写的有的乱,看起来不够清晰,所以整理了下完美解决这个问题,下面直接看代码. 一.重写viewpager import android.co ...

  8. Flutter ListView解决底部或顶部留白问题

    Flutter ListView解决底部或顶部留白问题 在没有设置padding的情况下,上下都有留白 方法一: ListView.builder(padding: EdgeInsets.zero,i ...

  9. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

最新文章

  1. 微信 小程序布局 水平菜单
  2. FastJson、Jackson、Gson进行Java对象转换Json的细节处理
  3. X-Magic Pair gcd,剪枝(1600)
  4. sht20温湿度传感器原理图_温湿度传感器在孵化行业怎么应用
  5. java 并发编程总结
  6. vue v html安全,vue 中控制v-html 中的样式,但不影响全局的小技巧
  7. 【转】为了修复打码女神脸,他们提出二阶段生成对抗网络EdgeConnect
  8. Sharding-Proxy分库配置_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记020
  9. Linux 安装 OFFICE 2007
  10. Java 操作 HBase 教程
  11. 实验 VoIP通信的配置
  12. atan和atan2的区别-Matlab三角函数
  13. 精彩Linux 篇章
  14. easyexcel 导出数据锁定某个单元格
  15. 微信小程序学习并搭建
  16. 数据字典的作用是什么,它有哪些条目?
  17. Kubernetes上基于longhorn和statefulsets的pv空间扩展
  18. 深度学习领域专有名词的理解与释义
  19. 2022京东618预售一般多久才发货啊?几天能收到货?
  20. 2021-05-12 MongoDB面试题 “ObjectID“有哪些部分组成

热门文章

  1. 两个多项式相乘求解系数数组算法
  2. Console.Write(程序猿?开发?写代码?编程?移动、网页、桌面开发?Oh,我连菜鸟都不是!);...
  3. seo超强外部链接、内部链接技巧
  4. 通用的权限管理系统发布
  5. vue配置git的子模块
  6. 分享一个前后端分离的web项目(vue+spring boot)
  7. ROS(Robot Operating System)笔记 : 1.使用launch file在gazebo中生成urdf机器人
  8. vue中的data用return返回
  9. 【机器学习实战】极大似然法
  10. 在屏幕上打印杨辉三角