`

Adapter的getView方法详解

阅读更多

BaseAdapter就Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter,我们经常使用的ListView 的adapter,即SimpleAdapter,是继承自BaseAdapter的,BaseAdapter是一个基类,没有实现绑定数据的功能,SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化。为什么需要优化呢?因为如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?这不可能,因为内存有限制。实际上Android为你缓存了视图。Android中有个叫做Recycler的构件,下图是他的工作原理:


如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。其实我的理解Recyler就是一个队列,用来存储不在屏幕范围内的item,如果item滚出屏幕范围,那么就入队,这里的滚出是完全滚出,即边界等也要完全滚出。如果新的item要滚进来,那么android系统的framework就会查看Recyler是否含有可以重复使用的iew,如果有那么就重新设置该iew 的数据源,然后显示,即出队。那么这么多的item其实只需要占用一定空间的内存,这个内存大小是多少呢?我的感觉是手机屏幕所包含的item的个数,再加上1,然后乘以每个item占用的内存。但是最后我发现是加上2.可能是为了使得缓存更大吧。。。。但是为什么加上2,大家应该理解,如果你不理解,那你就把滚动list的过程好好想一想。那个队列无非就是一个缓存罢了,因为我们的目的是通过那个缓存来重复使用那些已经创建的iew。

使用BaseAdapter的话需要重载四个方法,这些方法分别是getCount,getItem,getItemId,最后一个最重要的是getView,getView函数为什么重要呢?因为它是用来刷新它所在的ListView的。它在什么时候调用的呢?就是在每一次item从屏幕外滑进屏幕内的时候,或者程序刚开始的时候创建第一屏item的时候。看getView的api:

 

public abstract View getView (int position, View convertView, ViewGroup parent)

Since: API Level 1

Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file. When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) to specify a root view and to prevent attachment to the root.

Parameters
position convertView parent
The position of the item within the adapter's data set of the item whose view we want.
The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. Heterogeneous lists can specify their number of view types, so that this View is always of the right type (see getViewTypeCount() and getItemViewType(int)).
The parent that this view will eventually be attached to
Returns
  • A View corresponding to the data at the specified position.

position是指当前dataset的位置,通过getCount和getItem来使用。如果list向下滑动的话那么就是最低端的item的位置,如果是向上滑动的话那就是最上端的item的位置。conert是指可以重用的视图,即刚刚出队的视图。parent应该就是list。

 

为了让大家更好的理解这个函数,写了一个程序,请看:

public class MainActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView lv = (ListView)findViewById(R.id.listview);
        ArrayList<String> listdata = new ArrayList<String>();
        for(int i=0;i<400;i++){
        listdata.add("Item" + i);
        }
        lv.setAdapter(new MyAdapter(this, listdata));
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    public class MyAdapter extends BaseAdapter{
    private ArrayList<String> listdata;
    private Context context;
    
    public MyAdapter(Context context,ArrayList<String> listdata){
    this.context = context;
    this.listdata = listdata;
    }
@Override
public int getCount() {
// TODO Auto-generated method stub
return listdata.size();
}


@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return listdata.get(arg0);
}


@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}


@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
Log.i("position",arg0+"");
TextView tmView;
String temstr;
if(arg1 == null){
TextView tm = new TextView(context);
tmView = tm;
tmView.setTag("old" + arg0);
tmView.setText(listdata.get(arg0));
}else {
tmView = (TextView)arg1;
tmView.setText(listdata.get(arg0) + "\t" + arg1.getTag());
}

return tmView;
}
    
    }

}

从log中大家好好观察相关的输出结果,便可以将其理解

分享到:
评论

相关推荐

    android baseAdapter getview方法问题

    今天在写一个GridView的BaseAdapter时发现,Adapter的getview方法在position为0的时候会连续调用好几次。 我们知道谷歌时是做过优化的,让view有个缓存,我怀疑是因为做缓存的原因才让position连续调用 log如图 可见...

    ListView中getView重用好多次

    ListView中getView重用好多次,有头像的布局

    Android ListView适配器(Adapter)优化方法详解

    Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源? ...

    android 的listview 内部item的布局包含checkbox控件

    3.重写Adapter的getView方法时,为每个checkbox添加事件响应并记录选择状态,通过获取获取状态记录值获取所有选择的checkbox值。 需要注意的是第三点,在重写getView方法时,不要判断convertView == null,如果判断...

    android中ListView多次刷新重复执行getView的解决方法

    以前倒是没有注意listview的getView会重复执行多次,这次因为布局比较复杂,所以在测试的时候去断点跟踪,发现同一条数据不断的重复执行。觉得很奇怪,于是上网搜索了一下。网上的解释基本一致,就是ListView布局时...

    android listview getview多调用俩周期

    android listview getview多调用俩周期

    android gridview adapter 实例

    android gridview adapter 实例 每个getview显示不同的数据

    在ListView中自定义Adapter

    为便于学习自定义的Adapter,本案例的界面未进行美化,功能已经实现,对于其中的getView(int position,View view ,ViewGroup vg)做了数据的填充操作。本案例功能及其简单,只涉及ListView中自定义适配器,没有对...

    Android Adapter的几个常用方法

    Android Adapter的几个常用方法分享给大家,具体内容如下 1 ListView是在什么时候设置对Adapter的数据监听的?  在setAdapter(ListAdapter adapter)中,会先取消ListView中原来的mAdapter中的数据监听(mAdapter....

    android 通用的ViewHolder实现

    ListView的adapter的getView方法中,我们使用ViewHolder来保证getView的执行效率,例子是一个通用的ViewHolder的实现。

    Android 通过ViewHolder优化适配器的实现方法(必看)

    Adapter的getView()方法就是用来创建这些视图的,Adapter并不会为每行数据都创建一个新视图,而是提供了回收旧视图的方法。运行机制简单说就是当getView()方法被调用是,如果convertView参数不为null,就使用co

    baseAdapter的getView测试

    主要是测试baseAdapter的getView在生成实例时的空判断进行接卸

    通用Adapter

    写项目也有一段时间了,每次写ListView或者是GridView时,只要item内容不同,就要写不同的自定义adapter,感觉很麻烦,其实这些代码都可以抽出来,我们需要做的只是改写getView方法和ViewHolder,那下面我们就开始吧...

    通用adapter

    一个通用的适配器类,抽象了adapter的常用方法,只需要继承后重写getview()这个方法就可以了,方便适用 public abstract View getView(int position, View convertview, ViewGroup group);

    Android ListView 异步加载图片

    1.在adapter 的 getview方法里面启动加载图片的thread,如果listview在滑动则wait 2.监听listview滑动停止事件,获得listview显示的item的最上面和最下面的序号,并唤醒所有加载图片的thread,判断加载图片的序号...

    自定义Adapter并通过布局泵LayoutInflater抓取layout模板编辑每一个item实现思路

    写在前面的话: 看到标题这么长可能大家有点抓狂了,...我们自己定义了一个adapter并且通过getview方法对每一个条目进行了编辑和排版。然后最后将我们自定义的Adapter放入到了我们的ListView中以实现展示了这种效果下面

    浅谈Android开发中ListView控件性能的一些优化方法

    1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 ...

    CommonAdapter-通过封装BaseAdapter和RecyclerView.Adapter得到的通用的,简易的Adapter.zip

    避免重复建立监听器 一个item仅会触发一次绑定视图的操作,提示效率 支持dataBinding和其他第三方注入框架 提供了getView()方法来简化findViewById 支持通过item的构造方法来传入Activity对象 支持通过item的...

    listviewAdapter

    Adapter的一种写法 package com.xxkjx.jiusanqi; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; ...

Global site tag (gtag.js) - Google Analytics