【Android】ListView的工作原理

2019-05-20  本文已影响0人  感同身受_
  1. Adapter是ListView与数据之间的桥梁
  2. ListView在开始绘制的时候,系统首先调用getCount(),根据其返回值得到LiatView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView
    的每一项
  3. 当ListView的每一项将要显示时,都会调用Adapter的getView()方法返回一个View。
  4. ListView中有多少项,就调用多少次getView()方法去创建每一项的View,这一过程是耗时操作。
    【注】
    1.如果一个屏幕中可以呈现n项item,那么创建view视图的时候,系统会创建n+1个(因为当第一项item还未划出屏幕时,第n+1项item已经划入屏幕)
    2.在每次item进行view呈现的时候,因为屏幕中可以显示的item的个数是有限的,所以只要有一个item滑出屏幕,那么必然有一个item滑入屏幕,我们只需要将滑入屏幕的item呈现的view复用之前滑出的item对应的view即可。
    3.复用ViewHolder类。在类中定义item中需要复用的控件。然后在convertView创建的时候对应的创建viewHolder对象,然后给定标签进行关联。下一次滑入的item只需要取出这个标签进行控件的重新赋值即可。
    4.其实打的这个标签就是为了方便取出在convertView中需要重新赋值的控件。
  5. 示例代码:
package com.example.myadaptertest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private List<String> list;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        lv = findViewById(R.id.lv);
        //数据源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("数据源"+i);
        }
        //初始化适配器
        adapter = new MyAdapter();
        lv.setAdapter(adapter);
    }
    //实现自己的适配器
    class MyAdapter extends BaseAdapter{
        //计算需要适配的item的总数
        @Override
        public int getCount() {
            return list.size();
        }
        //获取每一个item对象
        @Override
        public String getItem(int position) {
            return list.get(position);
        }
        //获取每一个item对象的id
        @Override
        public long getItemId(int position) {
            return position;
        }
        //获取每一个item对应的View视图——重要
        //convertView:系统复用的视图
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder;
            //表示系统第一次运行
            if(convertView == null){
                convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.my_adapter_item,null);
                holder = new Holder();
                holder.tv = convertView.findViewById(R.id.myadapter_tv);
                //打标签
                convertView.setTag(holder);
            }else{
                // 进行复用
                holder = (Holder) convertView.getTag();

            }
            //赋值
            holder.tv.setText(list.get(position));


//            //获取布局映射器的对象
//            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
//            //1.将定义好的xml文件转化成View对象
//            View view = inflater.inflate(R.layout.my_adapter_item,null);
//            //2.给View对象中的控件进行赋值
//            TextView tv = view.findViewById(R.id.myadapter_tv);
//            //赋值
//            tv.setText(getItem(position));
//            //或者   tv.setText(list.get(position));
            return convertView;
        }
    }

    class Holder{
        private TextView tv;

    }
}
上一篇下一篇

猜你喜欢

热点阅读