使用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 并设置回调监听

public class LinearLayoutForListView extends LinearLayout {    private BaseAdapter adapter;    private OnItemClickListener  mOnItemClickListener;    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(BaseAdapter adapter) {        this.adapter = adapter;        // setAdapter 时添加 view        bindLinearLayout();    }    /**     * 绑定布局     */    public void bindLinearLayout() {        if (adapter == null) {            return;        }        int count = adapter.getCount();        this.removeAllViews();        for (int i = 0; i < count; i++) {            final View v = adapter.getView(i, null, null);            final int tmp = i;            final Object obj = adapter.getItem(i);            // 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);    }}

调用
list.setAdapter(madapter);list.setOnItemClickListener(new LinearLayoutForListView.OnItemClickListener() {    @Override    public void onItemClicked(View v, Object obj, int position) {

}});
时间: 2024-08-08 06:28:10

使用LinearLayout实现ListView,解决ListView和ScrollView滚动冲突的相关文章

重写ListView解决ListView内部ViewPaper滑动事件冲突问题

很简单 重写ListView 其他类似问题解决ScrollView嵌套ViewPager出现的滑动冲突问题 http://blog.csdn.net/zhangyiacm/article/details/37903071 package com.zy.myview; import android.content.Context; import android.util.AttributeSet; import android.view.GestureDetector; import androi

解决EditText跟ScrollView滑动冲突

etContent.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub //这句话说的意思告诉父View我自己的事件我自己处理 v.getParent().requestDisallowInterceptTouchEvent(true); return false; }

解决EditText和ScrollView滑动冲突问题

该类需要调用 OnTouchListener接口 黄色部分是需要更改部分,改为自己的edittext@Override public boolean onTouch(View view, MotionEvent motionEvent) { //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理:否则将事件交由其父类处理 if ((view.getId() == R.id.bags_stolen_characteristic_edittext && c

简单解决ListView和ScrollView冲突,复杂情况仅供参考

ScrollView嵌套ListView冲突问题的最优解决方案 (转) 记录学习之用 项目做多了之后,会发现其实 ScrollView嵌套ListVew或者GridView等很常用,但是你也会发现各种奇怪问题产生.根据个人经验现在列出常见问题以及代码最少最简单的解决方法. 问题一 : 嵌套在 ScrollView的 ListVew数据显示不全,我遇到的是最多只显示两条已有的数据. 解决办法:重写 ListVew或者 GridView,网上还有很多若干解决办法,但是都不好用或者很复杂. @Over

ScrollView+ListView滚动冲突,没有滑动效果 解决办法

问题背景 今天做个界面需要在整个布局都要滚动的基础上添加一个ListView元素,整个布局滚动当然用ScrollView.但是在ScrollView+ListView的布局画好后,发现整个界面都无法滚动,而且ListView只显示了第一条元素. 查看布局提示:The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView). 问题分析: 由上面那个提示可以看到

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

Android ListView高度自适应和ScrollView冲突解决

在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查,ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起了冲突,一般不建议两者套用. 下面说说具体解决方案.方案的主要思路就是根据ListView子项重置其高度. 首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法: 1 import andro

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题.今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题. 1.ScrollView布局中嵌套Listview显示不正常的解决方案 目前来说,解决这个问题有好几种解决方案,这里只介绍其中两种比较简单易行的其中两种. (1)自定义一个Listview,继承自Listview,代码如下: public class ListV

android解决listview与scrollview的冲突、自定义listview的高度以及上下拉刷新

     很多时候我们需要使用listview与嵌套使用,那么问题来了,listview里面自带了 滚动条,而又嵌套在scrollview里面.所以引发了一系列的冲突.listview显示不全. 今天给出一个全新的上下拉刷新与解决冲突的方案. .点击下载下拉刷新上拉加载工具      下载完工具后我们复制粘贴到我们自己的工程里面,使用方式和自定义view一样. 下面贴出代码 看到代码贴如也就这么回事.但是我们注意了,这个时候的listview是包裹在scroll里面的.那么滚动起来肯定不行的..