ListView的理解

来源:互联网 发布:mac多个桌面切换 编辑:程序博客网 时间:2024/05/21 12:01
ListView 的理解


E:\AndroidStudioProjects\ListViewSimpleTest


1.列表显示需要三个元素:
1.ListView 用来显示列表的View
2.适配器Adapter
ArrayAdapter:最简单,只能显示一行字
public ArrayAdapter(Context context,int textViewResourceId,List<T> objects);
参数:this,item的layout,数据源;
SimpleAdapter:最好扩充,可以自定义出各种效果
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)  
参数:this,数据源,item的layout,
from:一个将被添加到Map映射上的键民;
to:将绑定数据的试图ID

SimpleCursorAdapter:可以将数据库的列以列表形式展现

2.关于自定义Adapter


1.自定义的aAdapter 
如果继承BaseAdapter,必须重写getCount、getView方法。
继承ArrayAdapter<T>,局限于只能是一种类型,构造方法ArrayAdapter<T>(Context context, int resource, List<?> objects)
context:上下文对象
resource:ListView item的布局文件
List<?> :数据源
以此类推 
2.重写getView方法:(性能高)
    /**
     * 每个item显示出来必须调用的方法
     *
     * 使用缓存机制,性能高 ,
     * 如果布局已缓存,使用缓存的布局 convertView,如果没有缓存,则加载
     *
     * @param position
     * @param convertView
     * @param parent
     * @return
     */


    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        /*获取item*/
        ItemTextClass item = getItem(position);
        /*new 一个view 和viewHolder*/
        View view;
        ViewHolder viewHolder;
        /*如果 没有缓存布局*/
        if(convertView==null){
            /*加载布局*/
            view = LayoutInflater.from(getContext()).inflate(R.layout.list_ele, null);
            /*实例化viewholder*/
            viewHolder = new ViewHolder();
            /*存储布局中子布局的对象*/
            viewHolder.img = (ImageView)view.findViewById(R.id.image);
            viewHolder.big = (TextView)view.findViewById(R.id.big_text);
            viewHolder.small = (TextView)view.findViewById(R.id.small_text);
            viewHolder.time = (TextView)view.findViewById(R.id.time);
            /*缓存到view*/
            view.setTag(viewHolder);
        }else {
            /*如果缓存里面有布局,则直接获取该布局*/
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        /*将内容填充*/
        viewHolder.img.setImageResource(item.getImage());
        viewHolder.big.setText(item.getBigText());
        viewHolder.small.setText(item.getSmallText());
        viewHolder.time.setText(item.getTime());


        return view;
    }


class ViewHolder{
ImageView img;
TextView big;
TextView small;
TextView time;
}

3.viewHolder只是记录了item的子空间,减少了findViewByIde的操作,提高性能。

4.ListView的复用机制:
简单的理解就是 
能看到的view 叫做activityView,把activityView放入mActivityViews数组中
不能看到的叫做scrapView,把scrapView放入mScrapViews放入数组中。

当加载下一个view的时候,先找mActivityViews有没有 -->没有找 mScrapViews 加载进来 

所以说 ,当scrapView并没有马上销毁而是缓存在一个二维数组中。
原创粉丝点击