listview的getview的参数解析

工作原理:

  1. ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
  2. 一个新的视图被返回并显示

如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,下图是他的工作原理:

  1. 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。
  2. ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。
  3. 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。

请看下面的示例代码,这里在getView中使用了System.out进行输出

?
public class MultipleItemsListextendsListActivity{
  private MyCustomAdapter mAdapter;
  
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        mAdapter=newMyCustomAdapter();
        for (inti=0;i<50;i++)
            mAdapter.addItem("item"+i);
       setListAdapter(mAdapter);
    }
  
    private class MyCustomAdapter extends BaseAdapter{
        privateArrayList mData=newArrayList();
        privateLayoutInflater mInflater;
  
        public MyCustomAdapter(){
            mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
  
        public void addItem(finalString item){
            mData.add(item);
            notifyDataSetChanged();
        }
  
        @Override
        public intgetCount(){
            return mData.size();
        }
  
        @Override
        public String getItem(intposition){
            return mData.get(position);
        }
  
        @Override
        public longgetItemId(intposition){
            return position;
        }
  
        @Override
        public View getView(intposition,View convertView,ViewGroup parent){
            System.out.println("getView"+position+""+convertView);
            ViewHolder holder=null;
            if (convertView==null){
                convertView=mInflater.inflate(R.layout.item1,null);
                holder=newViewHolder();
                holder.textView=(TextView)convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            }else{
                holder=(ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }
  
    }
  
    public static class ViewHolder {
        public TextView textView;
    }
}


 

执行程序,然后在Logcat中查看日志

 

getView 被调用 9 次 ,convertView 对于所有的可见项目是空值(如下)

 

?
02 - 05  13 : 47 : 32.559 :INFO/System.out( 947 ):getView 0 null
02 - 05  13 : 47 : 32.570 :INFO/System.out( 947 ):getView 1  null
02 - 05  13 : 47 : 32.589 :INFO/System.out( 947 ):getView 2  null
02 - 05  13 : 47 : 32.599 :INFO/System.out( 947 ):getView 3  null
02 - 05  13 : 47 : 32.619 :INFO/System.out( 947 ):getView 4  null
02 - 05  13 : 47 : 32.629 :INFO/System.out( 947 ):getView 5  null
02 - 05  13 : 47 : 32.708 :INFO/System.out( 947 ):getView 6  null
02 - 05  13 : 47 : 32.719 :INFO/System.out( 947 ):getView 7  null
02 - 05  13 : 47 : 32.729 :INFO/System.out( 947 ):getView 8  null

 

然后稍微向下滚动List,直到item10出现:

 

convertView仍然是空值,因为recycler中没有视图(item1的边缘仍然可见,在顶端)

 

?
02 - 05  13 : 48 : 25.169 :INFO/System.out( 947 ):getView 9 null

 

再滚动List

 

convertView不是空值了!item1离开屏幕到Recycler中去了,然后item11被创建

 

?
02 - 05  13 : 48 : 42.879 :INFO/System.out( 947 ):getView 10  android.widget.LinearLayout @437430f8

 

再滚动:

?
02 - 05  14 : 01 : 31.069 :INFO/System.out( 947 ):getView 11  android.widget.LinearLayout @437447d0
02 - 05  14 : 01 : 31.142 :INFO/System.out( 947 ):getView 12  android.widget.LinearLayout @43744ff8
02 - 05  14 : 01 : 31.279 :INFO/System.out( 947 ):getView 13  android.widget.LinearLayout @43743fa8
02 - 05  14 : 01 : 31.350 :INFO/System.out( 947 ):getView 14  android.widget.LinearLayout @43745820
02 - 05  14 : 01 : 31.429 :INFO/System.out( 947 ):getView 15  android.widget.LinearLayout @43746048
02 - 05  14 : 01 : 31.550 :INFO/System.out( 947 ):getView 16  android.widget.LinearLayout @43746870
02 - 05  14 : 01 : 31.669 :INFO/System.out( 947 ):getView 17  android.widget.LinearLayout @43747098
02 - 05  14 : 01 : 31.839 :INFO/System.out( 947 ):getView 18  android.widget.LinearLayout @437478c0
02 - 05  14 : 03 : 30.900 :INFO/System.out( 947 ):getView 19  android.widget.LinearLayout @43748df0
02 - 05  14 : 03 : 32.069 :INFO/System.out( 947 ):getView 20  android.widget.LinearLayout @437430f8

convertView 如我们所期待的非空了,在item11离开屏幕之后,它的视图(@437430f8)作为convertView容纳item21了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ListView是Django中的一个内置视图,用于显示一个对象列表。下面是ListView的一些常用参数: - model:指定要使用的模型类。例如:`model = YourModel`。 - queryset:指定要使用的查询集。如果不指定该参数ListView将自动使用`model.objects.all()`获取所有对象列表。 - template_name:指定要使用的模板名称。例如:`template_name = 'your_template.html'`。 - context_object_name:指定在模板中使用的上下文变量名称。默认情况下,ListView将使用`object_list`作为变量名。 - paginate_by:指定每页显示的对象数量。例如:`paginate_by = 10`。如果设置了这个参数ListView将自动分页显示对象列表。 - ordering:指定对象列表的排序方式。例如:`ordering = ['-date_created']`。可以使用模型字段名和前缀符号('-'表示倒序)来指定排序方式。 - extra_context:指定额外的上下文数据,在模板中可以直接使用。例如:`extra_context = {'title': 'Your Object List'}`。 - context_processors:指定上下文处理器列表,用于在视图中处理和添加额外的上下文数据。 - allow_empty:指定是否允许空列表。默认为True,如果设置为False,当对象列表为空时,将返回404错误页面。 - paginate_orphans:指定当最后一页只有少于指定数量的对象时,是否合并到前一页。默认为0,表示不合并。 这些只是ListView的一些常用参数,你可以根据自己的需求在Django官方文档中找到更多关于ListView参数和详细说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值