Android——数据适配器 BaseAdapter的使用和优化

来源:互联网 发布:最早睡直播软件 编辑:程序博客网 时间:2024/05/20 15:58

1.数据适配器:将数据的来源与数据的显示进行解耦,降低了程序的耦合性。


2.数据适配器模式的应用:

(1)降低了程序的耦合性

(2)容易扩展

3.ListView的显示与缓存机制

需要才显示,显示完就被回收到缓存

4.数据适配器——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的显示内容


5.ViewHolder优化BaseAdapter思路

(1)创建Bean对象,用于封装数据

(2)在构造方法中初始化用于映射的数据List

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

(4)判断convertView,为空则创建,并设置tag,否则通过tag来取出ViewHolder

(5)给ViewHolder中的控件设置数据


源代码:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <ListView        android:id="@+id/listview"        android:layout_width="match_parent"        android:layout_height="match_parent">    </ListView></RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <ImageView        android:id="@+id/image"        android:layout_width="60dp"        android:layout_height="60dp"        android:src="@drawable/ic_launcher"/>    <TextView        android:id="@+id/tv_title"        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_toRightOf="@id/image"        android:text="Title"        android:gravity="center"        android:textSize="25sp"/>    <TextView        android:id="@+id/tv_content"        android:layout_width="match_parent"        android:layout_height="30dp"        android:layout_toRightOf="@id/image"        android:layout_below="@id/tv_title"        android:text="Content"        android:gravity="center_vertical"        android:textSize="15sp"/></RelativeLayout>

MainActivity.java

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 {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        List<ItemBean> list = new ArrayList<>();        for (int i = 0; i < 20; i++) {            list.add(new ItemBean(R.drawable.ic_launcher,"标题"+i,"内容"+i));        }        ListView listView = (ListView) findViewById(R.id.listview);        listView.setAdapter(new MyAdapter(this,list));    }}

ItemBean.java

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

MyAdapter.java

import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import java.util.List;import java.util.zip.Inflater;public class MyAdapter extends BaseAdapter {    private List<ItemBean> mList;    private LayoutInflater mInflater;    //数据源与适配器关联    public MyAdapter(Context context,List<ItemBean> list) {        mList = list;        //context:要使用当前的Adapter界面对象  mInflater:布局装载器对象        mInflater = LayoutInflater.from(context);    }    @Override    /**     * 返回ListView中需要显示的数据数量     */    public int getCount() {        return mList.size();    }    @Override    /**     * 返回指定索引对应的数据项     */    public Object getItem(int position) {        return mList.get(position);    }    @Override    /**     * 返回指定索引对应的数据项的ID     */    public long getItemId(int position) {        return position;    }    @Override    /**     * 每一项的详细显示内容     * 关键     */    public View getView(int position, View convertView, ViewGroup parent) {        /* 逗逼式        没有任何优化处理,每次都创建新的View,设置控件,效率底下        //通过mInflater.inflate()可以将一个布局xml文件转换为一个view对象        View view = mInflater.inflate(R.layout.item,null);        ImageView image = (ImageView) view.findViewById(R.id.image);        TextView title = (TextView) view.findViewById(R.id.tv_title);        TextView content = (TextView) view.findViewById(R.id.tv_content);        ItemBean itemBean = mList.get(position);        image.setImageResource(itemBean.itemImageResId);        title.setText(itemBean.itemTitle);        content.setText(itemBean.itemContent);        return view;        */        /*        //普通式        //利用了ListView的缓存特性,如果没有缓存才会创建新的View,算入门,但convertView依然会浪费大量时间        //convertView为空,表示View未被实例化,缓冲池也无缓存,这样做避免了重复创建大量的convertView        if (convertView == null) {            convertView = mInflater.inflate(R.layout.item,null);        }        ImageView image = (ImageView) convertView.findViewById(R.id.image);        TextView title = (TextView) convertView.findViewById(R.id.tv_title);        TextView content = (TextView) convertView.findViewById(R.id.tv_content);        ItemBean itemBean = mList.get(position);        image.setImageResource(itemBean.itemImageResId);        title.setText(itemBean.itemTitle);        content.setText(itemBean.itemContent);        return convertView;        */        //文艺式        //不仅利用了ListView缓存,更通过ViewHolder类,来显示数据的视图的缓存,避免多次通过findViewById寻找控件        //创建内部类ViewHolder        //判断convertView是否为空        //通过setTag将ViewHolder与convertView绑定        //getTag()取出关联的ViewHolder        //通过ViewHolder找到对应的控件        ViewHolder viewHolder;        if (convertView == null) {            viewHolder = new ViewHolder();            convertView = mInflater.inflate(R.layout.item,null);            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.image);            viewHolder.title = (TextView) convertView.findViewById(R.id.tv_title);            viewHolder.content = (TextView) convertView.findViewById(R.id.tv_content);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        ItemBean itemBean = mList.get(position);        viewHolder.imageView.setImageResource(itemBean.itemImageResId);        viewHolder.title.setText(itemBean.itemTitle);        viewHolder.content.setText(itemBean.itemContent);        return convertView;    }    private class ViewHolder {        public ImageView imageView;        public TextView title;        public TextView content;    }}





1 0