`

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 adapter详解

    Android Adapter 详解 Android Adapter 是 Android 开发中一个重要的组件,负责将数据绑定到用户界面中。今天,我们将深入探讨 Android Adapter 的原理和实现方式。 什么是 Android Adapter? Android Adapter 是...

    android开发Adapter详解

    1. **数据绑定**:Adapter通过其提供的方法(如getView())将数据模型中的数据绑定到视图组件上。 2. **数据加载**:当视图需要显示新的数据时,Adapter会自动更新视图,确保显示的是最新的数据。 3. **性能优化**:...

    Android Adapter详解(2)

    这篇博客“Android Adapter详解(2)”可能会深入探讨Adapter的工作原理、如何使用以及一些常见问题的解决方法。由于没有直接提供博客的具体内容,我将根据常规的Adapter知识进行详细解释。 Adapter是Android中用于将...

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

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

    自定义ViewGroup+Adapter

    2. 创建`Adapter`:根据数据源创建一个自定义`Adapter`,实现`getView()`方法来生成对应的视图。 3. 绑定数据:在`ViewGroup`的构造函数或者初始化方法中设置`Adapter`,并将`Adapter`的数据源与视图进行绑定。 4. ...

    安卓listview相关相关-ListView通过adapter传递对象.rar

    5. **getView()方法详解** - 在`getView()`方法中,首先检查`convertView`是否为空,如果不为空,那么复用这个View,否则新建一个View。 - 使用数据对象(例如`User`)来填充View的各个组件,如TextView、...

    Adapter继承关系结构图

    ### Adapter继承关系结构图知识点详解 #### 一、Adapter继承结构概述 在Android开发中,`Adapter`是一种非常重要的组件,主要用于将数据源中的数据与视图进行绑定,以实现列表或其他类型的视图控件的数据展示。...

    简单好用的Adapter—ArrayAdapter详解

    UserAdapter中的getView方法是关键,这是Adapter中必须重写的方法,它负责为ListView的每个条目创建视图。在这个方法中,我们首先获取当前项对应的User对象,然后通过LayoutInflater实例化布局资源。接着,找到布局...

    Android listview与adapter详解及实例代码

    例如,如果每个item需要显示多行文本或包含其他控件,我们需要创建一个自定义的布局文件,并在自定义Adapter的`getView()`方法中填充数据。 在实际应用中,我们可能还需要处理ListView的点击事件,这可以通过设置...

    Android之自定义Adapter的ListView

    自定义`Adapter`类需要继承自`BaseAdapter`或其子类,并实现其中的关键方法,如`getView()`、`getItemId()`、`getItem()`和`getCount()`等。 ##### 数据绑定过程详解 根据题目中的部分代码示例,我们可以进一步分析...

    android listview adapter

    - `getView(int position, View convertView, ViewGroup parent)`: 这是最重要的方法,负责为ListView创建或复用一个视图,其中position表示当前项的位置,convertView是可复用的视图,parent是ListView本身。...

    listview嵌套listview

    1. 创建主ListView的Adapter:首先,你需要创建一个适配主ListView的Adapter,这个Adapter需要在getView()方法中为每个Item创建一个新的视图,其中包含内嵌的ListView。 2. 创建子ListView的Adapter:接着,为内嵌的...

    简单好用的Adapter---ArrayAdapter详解

    自定义的UserAdapter扩展了ArrayAdapter,重写了`getView()`方法,这是Adapter中非常关键的一个方法。它负责创建或复用视图,并根据数据源中的数据填充视图。在这个例子中,`getView()`方法首先通过LayoutInflater从...

    详解Android应用中ListView列表选项栏的编写方法

    ListView的渲染过程主要依赖于getCount()和getView()两个方法。getCount()返回列表项的数量,而getView()负责为每一项生成对应的视图。在实际绘制过程中,ListView并不会为每个列表项都创建新的View,而是利用了视图...

    ListView相关控件详解

    - **BaseAdapter**:这是Adapter的基本实现,开发者需要重写其`getView()`方法来创建列表项。 - **ArrayAdapter**:基于BaseAdapter的简化版,适用于简单的数据结构,如数组或ArrayList。 - **CursorAdapter**:...

    pp列表之分组ListView详解

    同时,自定义Adapter的 `getView()` 方法提供了足够的灵活性,可以根据需求定制更复杂的视图样式和交互行为。在实际开发中,开发者可以根据项目需求调整数据结构和Adapter逻辑,以实现各种各样的分组效果。

    ListViewAdapter和ViewHolder代码,安卓listview适配器.rar

    **ListViewAdapter详解** ListViewAdapter是Android SDK提供的一个抽象类,它是BaseAdapter的子类。开发者需要通过继承ListViewAdapter并实现其抽象方法,以便为ListView提供数据。这些方法包括: 1. `int getCount...

    GridView全部用法实例详解

    你需要创建一个继承自BaseAdapter的自定义Adapter,重写其中的`getCount()`(返回数据项数量)、`getItem(int position)`(获取指定位置的数据项)、`getItemId(int position)`(返回数据项的ID)和`getView(int ...

Global site tag (gtag.js) - Google Analytics