美文网首页
【Android】ListView的工作原理

【Android】ListView的工作原理

作者: 感同身受_ | 来源:发表于2019-05-20 17:19 被阅读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;
    
        }
    }
    

    相关文章

      网友评论

          本文标题:【Android】ListView的工作原理

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