ListView之getView详解

  首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(Inflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。 

  然后来看函数原型publicView getView(intposition, View convertView, ViewGroup parent),参数中position是指当前item在屏幕中的位置,convertView相当于缓存的作用。函数返回一个View作为ListView中一个item的布局。

下面看一个getView()例子:

   public View getView(int position, View convertView, ViewGroup parent) {
    Fruit fruit = getItem(position); // 获取当前项的Fruit实例
    View view;
    ViewHolder viewHolder;
    if (convertView == null) {
        view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
        viewHolder = new ViewHolder();
        viewHolder.fruitImage = (ImageView) view.findViewById (R.id.fruit_image);
        viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);
        view.setTag(viewHolder); // 将ViewHolder存储在View中
    } else {
        view = convertView;
        viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder
    }
    viewHolder.fruitImage.setImageResource(fruit.getImageId());
    viewHolder.fruitName.setText(fruit.getName());
    return view;
}

  假设一个ListView有50个item,一个屏幕最多显示ListView的10个item。当开始显示时,屏幕先显示前10个item,这10个item都是初次加载,所以convertView为空,这时候创建一个viewHolder(viewHolder起到储存和关联layout中的相关控件),然后再将viewHolder储存在要返回的View中。之后layout中的控件动态关联resource文件夹下的图片等。

  每次新加载一个item时都重复上述的动作。

  但当你向前滑动,浏览之前加载过的item时,convertView缓存的作用就会提高性能,此时,之前在该位置返回的View会作为getView()的convertView参数传入,所以convertView不为空,直接进行赋值操作,再取出之前储存在View中的viewHolder,无需创建新的View和viewHolder,性能大大提高。


  • 17
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来详细介绍一下ListView和CycleView。 1. ListView ListView是Android提供的一个用于展示长列表数据的控件。它可以通过Adapter来动态加载数据,并且支持滚动、选中、点击等基本操作。ListView的优点是可以自动回收不可见的子视图,以便节省内存,同时也可以通过设置缓存策略来提高性能。 ListView的使用步骤如下: 1)在布局文件中添加ListView控件。 2)创建一个Adapter,实现getView()方法,用于动态加载数据。 3)在代码中调用setAdapter()方法,将Adapter绑定到ListView上。 4)通过setOnItemClickListener()方法来监听ListView子项的点击事件。 2. CycleView CycleView是一个可循环滚动的视图容器,也称为轮播图。它通常用于在界面中展示多张图片或广告,自动进行滚动切换,使得用户能够快速浏览内容。CycleView的实现方式有多种,可以使用ViewPager、RecyclerView等控件进行实现。 CycleView的使用步骤如下: 1)在布局文件中添加ViewPager控件。 2)创建一个Adapter,实现instantiateItem()方法,用于动态加载数据。 3)在代码中调用setAdapter()方法,将Adapter绑定到ViewPager上。 4)通过Handler和Runnable实现自动轮播功能。 5)通过ViewPager的addOnPageChangeListener()方法来监听当前页面的变化,以便在需要时进行相应的处理。 总的来说,ListView适合展示长列表数据,而CycleView则适合展示多张图片或广告等内容。两者都是Android中常用的视图控件,开发者可以根据自己的需求选择合适的控件进行使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值