资讯专栏INFORMATION COLUMN

ScrollView嵌套ListView滑动冲突的简单解决方法

ybak / 3049人阅读

摘要:和这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。那我们该怎么办呢别着急,有一个简单的方法可以起死回生。这些步骤是为了保证的高度不出现问题。

ScrollView和ListView这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。比如,我们如果想在ListView下面添加其他的布局或者控件,然后想让它们作为一个整体都可以滑动的话,最常想到的就是用一个ScrollView把它们包裹起来。想法似乎很美好,但是现实就有点残酷了。我们可以写一个小例子体验一下。

首先创建一个Activity,在它的布局文件上放置一个ListView:




    
    


然后在代码中使用for循环生成一些数据,并使用ArrayAdapter适配数据。这里允许我偷一下懒,ListView的item布局直接使用Android提供的R.layout.simple_list_item_1,而没有自己去自定义。

public class TestActivity extends Activity {
    private ListView listView;
    private ArrayList list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        listView = (ListView) findViewById(R.id.listView);
findViewById(R.id.ll_container);

        list = new ArrayList<>();
        //生成需要显示到ListView中的数据
        for (int i = 0; i < 30; i++) {
            list.add("这是数据"+i);
        }
        //使用ArrayAdapter适配数据
        listView.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1,list));
    }
}

确保你当前的Activity为启动Activity,然后运行App,可以看到如下的效果:

好,看起来没有问题,但是如果这时我们需要在这个ListView的头部或者底部添加一些控件,然后让它们整体都可以滑动呢?我们可以先这样试试:




    

        
            
        

        

        

        

在ListView的头部和底部加了几个控件,然后把所有的控件都用一个线性布局包裹起来,再把最外层的布局改为ScrollView,再次运行,麻烦出现了:

天!我们的ListView只剩下小小的一行了!试着滑动一下,发现滑动是没有问题的,就是只能显示一行。那我们该怎么办呢?

别着急,有一个简单的方法可以起死回生。我们可以自定义一个ListView:

/**
 * 自定义ListView
 */
public class MyListView extends ListView {

    public MyListView(Context context) {
        super(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,//右移运算符,相当于除于4
                MeasureSpec.AT_MOST);//测量模式取最大值
        super.onMeasure(widthMeasureSpec,heightMeasureSpec);//重新测量高度
    }
}

在这个ListView中我们重写了onMeasure方法,然后重新定义heightMeasureSpec参数,它的大小取最大值的四分之一(一般的做法),测量模式取最大值,然后调用父类的构造方法重新传入heightMeasureSpec参数。这些步骤是为了保证ListView的高度不出现问题。完成后,我们在布局文件中使用自定义的ListView:




    

        

        

        

        

        

运行之后,发现问题解决了!ListView可以完整地显示,而且也可以滑动到头部和顶部的布局。

其实要想显示ListView的头部或者底部布局或者控件的话不一定要用ScrollView,我们也可以将头部和底部作为一个整体的布局,即头布局或者脚布局,然后调用ListView的addHeaderView方法或者addFooterView方法就可以将它添加到ListView的头部或者底部了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13670.html

相关文章

  • ScrollView嵌套ListView滑动冲突简单解决方法

    摘要:和这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。那我们该怎么办呢别着急,有一个简单的方法可以起死回生。这些步骤是为了保证的高度不出现问题。 ScrollView和ListView这两个控件想必大家都不会陌生,但是这两者嵌套使用的时候就会出现麻烦。比如,我们如果想在ListView下面添加其他的布局或者控件,然后想让它们作为一个整体都可以滑动的话,最常想到的就是用一...

    dingding199389 评论0 收藏0
  • 滑动 - 收藏集 - 掘金

    摘要:分析提到侧滑删除,一个经典的例子就是玩转仿探探卡片式滑动效果掘金讲起本篇博客的历史起源,估计有一段历史了。列表左右滑动开源组件掘金是一款用于为上的排布提供左滑右滑操作的库。 Android 仿 YouTube 拖拽视频效果的实现 - Android - 掘金Android仿YouTube拖拽视频效果的实现 youtube-like-drag-video-view 代码已经开源到GitH...

    ShevaKuilin 评论0 收藏0
  • 定制主题下ScrollView嵌套ListView体验问题优化

    摘要:推测在页面超过屏幕边界时了滑动事件,未超过边界时仍然分发了事件。打开源码找找证据在方法中,第个判断条件证实猜测。创建,重写方法,验证问题解决。结束版本多,厂商也多,嵌套不仅会带来性能问题,也会带来一些适配问题,不偷懒定制是更稳妥的解决方案。 前言 虽然google文档中明确反对在ScrollView中嵌套ListView,但这种场景在UI设计中仍然很普遍,一般遇到的问题是ListVie...

    dkzwm 评论0 收藏0
  • Android滑动冲突解决

    摘要:对于底层的来说,有一种方法可以阻止父层的截获事件,就是调用方法。父控件就不会拦截的滑动事件父容器需要此类点击事件(1).场景一:外部滑动方向跟内部滑动方向不一致,比如外部左右滑动,内部上下滑动   ViewPager+Fragment配合使用,会有滑动冲突,但是ViewPager内部处理了这种滑动冲突   如果采用的不是ViewPager而是ScrollView就必须手动处理滑动事件  ...

    shiweifu 评论0 收藏0
  • 界面工具 - 收藏集 - 掘金

    摘要:上列表左右滑动开源组件掘金是一款用于为上的排布提供左滑右滑操作的库。这里我贴出最终的兼容方案教你用两层嵌套实现三级展示界面掘金最近项目中使用一个三级展示列表,要求第一级和第二季都可以折叠,并有不同的图标变换,第三层展示数据,可点击。 八年 Android 开发,看我如何简化 Android 的 UI 开发! - Android - 掘金作者 : Super Mary 校对者: Zhao...

    wuaiqiu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<