阅读 186

Android 入门(二)- BaseAdapter

Android 入门(二)- BaseAdapter

ListView和BaseAdapter

什么是数据适配器?

我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter

.ListView的显示与缓存机制

ListView、GridView等控件可以展示大量的数据信息。假如ListView可以展示100条信息,但是屏幕的尺寸是有限的,一屏幕只能显示的7条。当向上滑动ListView的时候,item1被滑出了屏幕区域,那么系统就会将item1回收到Recycler中,即View缓冲池中,而将要显示的item8则会从缓存池中取出布局文件,并重新设置好item8需要显示的数据,并放入需要显示的位置。这就是ListView的缓冲机制,总结起来就是一句话:需要时才显示,显示完就被会收到缓存。ListView,GridView等数据显示控件通过这种缓存机制可以极大的节省系统资源。

.BaseAdapter

.BaseAdapter
使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
public int getCount(): 适配器中数据集的数据个数;

public Object getItem(int position): 获取数据集中与索引对应的数据项;

public long getItemId(int position): 获取指定行对应的ID;

public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。

下面通过一个简单示例演示如何使用BaseAdapter。

1.创建布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.cbt.learnbaseadapter.MainActivity">

    <ListView
        android:id="@+id/lv_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        /></RelativeLayout>

item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/iv_image"
        android:src="@mipmap/ic_launcher"
        android:layout_width="60dp"
        android:layout_height="60dp"/>
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_toEndOf="@id/iv_image"
        android:text="Title"
        android:gravity="center"
        android:textSize="25sp"/>

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/iv_image"
        android:layout_below="@id/tv_title"
        android:text="Content"
        android:textSize="20sp"/></RelativeLayout>

2.创建数据源

package com.cbt.learnbaseadapter;/**
 * Created by caobotao on 15/12/20.
 */public class ItemBean {    public int itemImageResId;//图像资源ID
    public String itemTitle;//标题
    public String itemContent;//内容

    public ItemBean(int itemImageResId, String itemTitle, String itemContent) {        this.itemImageResId = itemImageResId;        this.itemTitle = itemTitle;        this.itemContent = itemContent;
    }
}

通过此Bean类,我们就将要显示的数据与ListView的布局内容一一对应了,每个Bean对象对应ListView的一条数据。这种方法在ListView中使用的非常广泛。

MainActivity.java

package com.cbt.learnbaseadapter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;import java.util.ArrayList;import java.util.List;
public class MainActivity extends AppCompatActivity {    ListView mListView ;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);        List<ItemBean> itemBeanList = new ArrayList<>();        for (int i = 0;i < 20; i ++){
            itemBeanList.add(new ItemBean(R.mipmap.ic_launcher, "标题" + i, "内容" + i));
        }
        mListView = (ListView) findViewById(R.id.lv_main);        //设置ListView的数据适配器
        mListView.setAdapter(new MyAdapter(this,itemBeanList));
    }
}

3.创建BaseAdapter

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder;    //如果view未被实例化过,缓存池中没有对应的缓存
    if (convertView == null) {
        viewHolder = new ViewHolder();        // 由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null
        convertView = mInflater.inflate(R.layout.item, null);        //对viewHolder的属性进行赋值
        viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_image);
        viewHolder.title = (TextView) convertView.findViewById(R.id.tv_title);
        viewHolder.content = (TextView) convertView.findViewById(R.id.tv_content);        //通过setTag将convertView与viewHolder关联
        convertView.setTag(viewHolder);
    }else{//如果缓存池中有对应的view缓存,则直接通过getTag取出viewHolder
        viewHolder = (ViewHolder) convertView.getTag();
    }    // 取出bean对象
    ItemBean bean = mList.get(position);    // 设置控件的数据
    viewHolder.imageView.setImageResource(bean.itemImageResId);
    viewHolder.title.setText(bean.itemTitle);
    viewHolder.content.setText(bean.itemContent);    return convertView;
}// ViewHolder用于缓存控件,三个属性分别对应item布局文件的三个控件class ViewHolder{    public ImageView imageView;    public TextView title;    public TextView content;
}

总结一下用ViewHolder优化BaseAdapter的整体步骤:

1 创建bean对象,用于封装数据;

2 在构造方法中初始化的数据List;

3 创建ViewHolder类,创建布局映射关系;

4 判断convertView,为空则创建,并设置tag,不为空则通过tag取出ViewHolder;

5 给ViewHolder的控件设置数据。

来源https://www.cnblogs.com/random-name/p/14780922.html

文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐