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中的控件設定資料