美文网首页
4.3View相关-listView详解

4.3View相关-listView详解

作者: 205蚁 | 来源:发表于2018-11-18 15:36 被阅读0次

listView详解

    1. 什么是listView
    1. listView适配器模式
    1. listView的recycleBin机制。垃圾回收机制
    1. listView的优化

1.什么是listView

ListView就是一个能把数据集合以动态滚动的方式展现在用户界面上的View。本质上是一个View,专门用户处理数据很多,屏幕一次展现补全的场景

2.listView适配器模式

适配器模式:
Datasource(Cursor、ArrayList) <--Adapter -->ListView
用法,继承BaseAdapter,通过ListViw的setAdapter把数据传递给ListView

到底什么是Adapter?
因为android的listView需要把各种可能的数据和用户自定的View全部显示在屏幕上,而ListView本身是一个View,他不关心数据是什么,他只是一个垂直显示的列表而已,它最关心的是ListView的item那个position即哪个位置显示哪一个View。它只是关系把View准确无误的显示到它所在的Item上。ListView和数据是分开的,不直接接触,只能通过Adapter适配器把数据加载到ListView的屏幕上

图示可以看出Adapter是数据源和ListView的桥梁,它负责为每一个数据制作View交给View来显示,adapter的出现就是为了保证数据和View分离
MVC的设计模式,它只会通过adapter来处理真正的数据源,同时adapter接口又是统一的,这会让ListView不用去担心数据适配方面的问题,由于Adatper是一个接口,每个子类都可以自定义自己的功能
图:




图[图片上传中...(5-3 listview缓存面[00_07_20][20180720-204747-2].jpg-1e85a1-1542526912822-0)]



    Activity中:listView.setAapter(new MyAdapeer(this));
    MyAdapter extends BaseAdapter
    #Context
    -----------
    +getCount() int
    +getItem(int position) object
    +getItemId(int position) long
    +getView(int position,View convertView,ViewGroup parent) View

ViewHolder机制

ListView绘制 getCount->getView->

3.listView的recycleBin机制。垃圾回收机制

数据很多,频繁滑动
源码
UML 类结构图:


class RecycleBin{
        private RecyclerListener mRecyclerListener;
        private int mFirstActivePosition;
        private View[] mActionViews = new Views[0];//屏幕上正在可见的View,这些View是可以被复用的
        private ArrayList<View> mScrapViews;//他是一个二维数组,他表示所有废弃类型View的list,当屏幕滑出去时,他的item就变成了scrapView一员。
        private ArrayList<View> mCurrenScrap;//当前废弃的View的List,刚刚滑出去
        //ListView滑动的时候会把滑出去的View删除,这样就不会绘制那些看不见的View,那些看不见的View会放在RecycleBin里头(回收站,需要时去还原)
        
        方法:
        public void setViewTypeCount(int viewTypeCount){
            为ListView中的每一个类型的数据项建立一个recyclebin机制,意思是说可以为不同类型的View 都设置recyclebin机制
            默认是1. 即一种设置类型
        }
        
        //填充,存储
        void fillActiveViews(int childCount,int firstActivePosition){
            //参数1.表示要存储的View的数量
                参数2.表示ListView当中第一个可见元素的position值
                
        }
        //获取屏幕上相应显示的View
        View getActiveView(int position){//position表示item在ListView中的位置
            int index = position - mFirstActivePosition;//神奇的地方,将position的值转成mActiveViews数组的下标值
            
            final View[] activeViews = mActiveViews;
            if(index >=0 && index <activeViews.length){
                final View match = activeViews[index];
                activeViews[index] = null;//下次获取同样位置的View会是null,mActiveView在屏幕上的View是不能被重复利用的
                return match;
            }
            return null;
        }
        
        void addScrapView(View scrap,int position){//接收刚刚被划出,要废弃的View,添加到mScrapViews中
            final AbsListView.LayoutParams lp = (AbsListView.LayoutParams)scrap.getLayoutParams();
            
        }
}
图:

4.listView的优化

    1. convertView重用 /ViewHolder
    1. 三级缓存/监听滑动事件

1.convertView重用 /ViewHolder
Adapter中,方法getView(int position,View convertView,ViewGroup parent) 中convertView就是一个缓存的作用

        ViewHolder = holder;
        if(convertView = null){
            holder = new ViewHolder;
            convertView = LayoutInflater.from(context).inflate(R.layout.list_item,null);
            holder.img = convertView.findViewById();
            convertView.setTag(holder)
        }else{
            holder = convertView.getTag();
        }
        return convertView;
        

1.convertView 复用非常重要 2.View是二叉树结构,每次遍历都耗性能,减少findViewById
2.三级缓存/监听滑动事件

  • 图片加载的时候用到缓存机制来进行,
  • 在getView中尽量少进行耗时的操作,这是为了保证在ListView滑动当中的流畅性,一旦做耗时操作,就显示ListView的卡顿
  • 一定要在ListView中加载图片,可以设置监听事件,可以当ListView滑动停止时加载图片
  • ListView的Item的布局当中尽量避免半透明的元素,因为半透明的绘制比不透明耗时, 同时可以开启硬件加速

相关文章

网友评论

      本文标题:4.3View相关-listView详解

      本文链接:https://www.haomeiwen.com/subject/axnnxqtx.html