带布局的ListView

本文介绍了在Android开发中如何处理ScrollView内嵌ListView时的滑动冲突,分析了两种主要解决方案:自定义ListView和只用ListView,并对各种方案的优劣进行了对比,包括自定义ListView、手动设置ListView高度、自定义LinearLayout模拟ListView、自定义Adapter以及使用addHeaderView的方法。
摘要由CSDN通过智能技术生成

一、问题描述


在Android开发中使用最多的复合控件非ListView莫属了,稍复杂的UI会在ListView上面增加布局,最常见的就是上面广告栏,下面ListView,类似于下面这种:

在界面上下滑动时,上面的广告栏布局能够随着ListView滑动。

二、 解决方法

关于这个问题的解决方案,网上也有一大批了,但是基本都没有对这些解决方案的原理进行分析,只是知其然不知其所以然,所以本文的目的除了要对这些解决方案进行分类解析,还会对这些方案的优劣进行对比。下面进入正题。
常用的解决方案大体分为两类:一类是在ScrollView里面嵌套ListView,一类是只用ListView。
下面分别分析这两类方案。
1. 在ScrollView里面嵌套ListView
在ScrollView里面嵌套ListView会出现两个问题:第一,ScrollView和ListView都有上下滑动事件,放在一起会存在滑动冲突;第二,ListView的高度显示问题。
1) ScrollView和ListView都有上下滑动事件
ScrollView嵌套ListView时,到底应该怎么滑动呢?我通过黑盒测试的方法做了四个实验:
第一次,把ListView的高度设置成match_parent或wrap_content,把ScrollView的fillViewPort设置为false,此时ListView只显示一行,因此ScrollView不能滑动,ListView虽然只有一行还是能滑动的。
第二次,把ListView的高度设置成match_parent或wrap_content,把ScrollView的fillViewPort设置为true,此时ScrollView和ListView都是全屏显示,但是没有超出屏幕,所以ScrollView不能滑动,而ListView可以滑动。
第三次,把ListView的高度设置成较小的固定值,比如300dp,把ScrollView的fillViewPort设置为false(默认值),此时ScrollView不能滑动,而ListView可以滑动。
第四次,把ListView的高度设置成较大的固定值,比如1000dp,把ScrollView的fillViewPort设置为false(默认值),此时ScrollView和ListView的高度都超出了屏幕,但是只有ScrollView在滑动,因为滑动ListView的时候上面的布局被滑动上去了。
通过这四个实验,基本可以看出ScrollView嵌套ListView时的滑动处理顺序:
i. 当ScrollView能够滑动时,ScrollView的滑动会覆盖掉ListView的滑动;
ii. 能滑动的条件是ScrollView或ListView的内容超出了其布局或控件的高度。
也就是说,ScrollView嵌套ListView本身对滑动事件的处理已经满足了我们的需求,所以也就不需要对滑动事件自己再进行处理。

2) ListView的高度显示问题
上面分析了滑动冲突的问题,可以看出滑动冲突不需要自己解决,所以这个解决方案的核心就集中到了ListView的高度显示问题上了。解决这个问题,常用的有三种方案:第一是自定义ListView,第二是手动设置ListView高度,第三是自定义LinearLayout模拟ListView。
i. 自定义ListView

public class ListViewForScroll extends ListView
{
   
    public ListViewForScroll(Context context)
    {
        super(context);
    }

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

    public ListViewForScroll(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值