listview学习心得

本文介绍了Android中ListView的基础知识,包括其在数据分页加载、图片缓存、动态加载数据等方面的应用。讨论了在开发中可能遇到的问题,如滑动停止下载以优化性能,以及ScrollView与ListView的冲突及解决方法。还详细阐述了ListView的分页加载实现,以及如何处理ScrollView嵌套ListView导致的显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

listview的基础知识

  1. ListView简介
    listview是android常用的一个控件,通常以列表额形式展示数据,并且当加载的数据过多的时候可以分页加载,动态显示数据,通常是横向现实数据。
  2. ListView的使用场景
    listview分页加载数据
    listview和图片缓存
    listview动态加载数据
    listview在开发中遇到的问题
  3. listview实现数据加载步骤
    listview适合自底向上的开发模式,即从每个条目的现实组件,到对其进行控制的数据结构,最后通过activity等进行使用
    首先是item组件,即用于每项布局输出的xml文件。有默认的item组件,当需要比较丰富的显示效果时,一般自定义xml实现
    其次是父对象layout,即用于activity或者fragment的布局输出文件,一般在此输出文件中包含listview,当然,如果采用listfragment或listactivity,并不需要再显示定义的listview组件
    定义数据接口(容器),即用于持有单个item的数据,可以是简单的String,也可以通过抽象item所需字段组成一个类,抽象的原则是与item中的组件对。本文中上图涉及多个字段,因此通过抽象组件形成BBSTopicItem类
    列表适配器:决定每行item中具体显示什么内容,以怎样的样式显示等,通常通过arraydaapter,simpleadapter等实现,本文定义BBSTopAdapter,集成ArrayAdapter< BBSTopicItem >
    最后需要定义一个activity或fragment来使用上述模块。listview可以直接被listactivity或者listfragment来使用
  4. listview滑动停止下载
    滑动时停止下载也是提高用户体验的方式之一,因为如果在listview滑动过程中执行下载任务,将会使得listview出现卡顿,滑动监听状态改变的方法是onScrollStateChange。该方法是在OnScrollListener接口中定义的,而OnScrollListener是AbsListView中为了在列表或网格滚动执行回掉函数而定义的接口。
  5. Scrollview与listview冲突
    如果scrollview中嵌套了listview(原则上要避免这种情况),那么可能出现:listview只显示一行,页面默认不从顶端开始显示;listview滑动事件无法监听
    解决方案
    1.listview需要手动设置高度
    listview需要设置listview.setFocusable(false)
    2.重载listview的onInterceptTouchEvent方法,在ACTION_DOWN时通过ScrollView的requestDisallowInterceptTouchEvent方法设置交出onTouch权限,ACTION_CANCEL时再恢复ontouch权限
  6. listview的分页加载
    a.listview分页加载功能:listview的分页功能主要是我们加载数据很多,不可能将某些数据全部显示在界面上,通常是手指滑动的时候会有“查看更多”,当我点击或者下拉时就是开始加载更多的信息,这样的功能我们一般叫下拉刷新
    b.首先用户确认默认展示listview上的数据,比如listview每页默认显示多少条数据将数据传递给自定义适配器上,然后加载新的数据了,通过通过监听listview的滑动事件,判断是否是最后一条,如果达到最后一条则开始刷新。
  7. ScrollView嵌套ListView,出现listview只显示一条记录的情况
    解决方案(重写listview):
public class ListViewNoScrollView extends ListView {
    public ListViewNoScrollView(Context context) {
        super(context);
    }

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

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

    /**
     * 设置不滚动
     */
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值