天天看點

BaseAdapter的使用與優化BaseAdapter的使用與優化

BaseAdapter的使用與優化

本文是基于慕課網eclipse_xu老師講解

Android必學-BaseAdapter的使用與優化

,自己做的整理筆記,在此感謝老師和慕課網的分享,視訊連結如下: http://www.imooc.com/learn/365

标簽(空格分隔): BaseAdapter Android 慕課網

  • BaseAdapter的使用與優化
    • ListView的緩存機制
    • BaseAdapter的逗比式
    • BaseAdapter普通式
    • BaseAdapter文藝式

資料擴充卡模式的應用:

1. 降低程式耦合性

2.容易擴充

1.ListView的緩存機制

需要才顯示,顯示完就被會受到緩存

2.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的顯示内容

ItemBean.java

package com.excavator.baseadapter;

/**
 * 項目名稱:BaseAdapter
 * 類描述:
 * 建立人:admin
 * 建立時間:2015/5/14 21:13
 * 修改人:admin
 * 修改時間:2015/5/14 21:13
 * 修改備注:
 */
public class ItemBean {
    public int ItemImageResid;
    public String ItemTitle;
    public String ItemContent;

    public ItemBean(int itemImageResid, String itemTitle, String itemContent) {
        ItemImageResid = itemImageResid;
        ItemTitle = itemTitle;
        ItemContent = itemContent;
    }
}
           

MainActivity.java:

package com.excavator.baseadapter;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<ItemBean> itemBeanList = new ArrayList<>();
        for (int i=;i<;i++){
            itemBeanList.add(new ItemBean(
                    R.mipmap.ic_launcher,
                    "我是标題"+i,
                    "我是内容"+i));
        }
        ListView listView = (ListView) findViewById(R.id.lv_main);
        listView.setAdapter(new MyAdapter(this,itemBeanList));
    }
}
           

MyAdapter.java:

package com.excavator.baseadapter;

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;

/**
 * 項目名稱:BaseAdapter
 * 類描述:
 * 建立人:admin
 * 建立時間:2015/5/14 21:21
 * 修改人:admin
 * 修改時間:2015/5/14 21:21
 * 修改備注:
 */
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
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    //傳回每一項的現實内容
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //逗比式 沒有任何優化處理,每次都建立新的View,設定控件 效率極其低下
        View view = mInflater.inflate(R.layout.item, null);
        ImageView imageView = (ImageView) view.findViewById(R.id.iv_image);
        TextView title = (TextView) view.findViewById(R.id.tv_title);
        TextView content = (TextView) view.findViewById(R.id.tv_content);
        ItemBean bean = mList.get(position);
        imageView.setImageResource(bean.ItemImageResid);
        title.setText(bean.ItemTitle);
        content.setText(bean.ItemContent);

        return view;
    }
}
           

3.BaseAdapter普通式

//普通式 利用了ListView的緩存特性,如果沒有緩存才建立新的View 但findViewById依然會浪費大量時間
        if (convertView==null) {
            convertView = mInflater.inflate(R.layout.item, null);
        }
        ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_image);
        TextView title = (TextView) convertView.findViewById(R.id.tv_title);
        TextView content = (TextView) convertView.findViewById(R.id.tv_content);
        ItemBean bean = mList.get(position);
        imageView.setImageResource(bean.ItemImageResid);
        title.setText(bean.ItemTitle);
        content.setText(bean.ItemContent);
        return convertView;
           

4.BaseAdapter文藝式

建立内部類ViewHolder

//建立内部類ViewHolder
    class ViewHolder  {
        public ImageView imageView;
        public TextView title;
        public TextView content;
    }
           
//文藝式 不僅利用了ListView的緩沖,更通過ViewHolder類來實作顯示資料的視圖的緩存,避免多次通過findViewById尋找控件
        ViewHolder viewHolder;
        //判斷convertView是否為空
        if (convertView==null) {
            viewHolder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.item, null);
            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将ViewHolder與convertView綁定
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        ItemBean bean = mList.get(position);
        viewHolder.imageView.setImageResource(bean.ItemImageResid);
        viewHolder.title.setText(bean.ItemTitle);
        viewHolder.content.setText(bean.ItemContent);

        return convertView;
           

總結:

ViewHolder優化BaseAdapter思路

  • 建立Bean對象,用于封裝資料
  • 在構造方法中初始化用于映射的資料List
  • 建立ViewHolder類,建立布局映射關系
  • 判斷convertView,為空則建立,并設定Tag,否則通過Tag來取出ViewHolder
  • 給ViewHolder中的控件設定資料

繼續閱讀