效果圖
效果圖
步驟
- 定義item,布局文件中引入ListView標簽
- 定義一個bean類,用于對item中數據進行包裝
- 定義adapter,繼承baseAdapter
- activity中,定義一個List,將bean數據初始化,并add到Lsit中;List傳給adapter,adapter和listview綁定。
區別就在于adapter的getView方法中,分為三種。
1、直接定義一個view,然后返回view
public View getView(int position, View convertView, ViewGroup parent) {
View view = inflator.inflate(R.layout.item, null);
ImageView image = (ImageView) view.findViewById(R.id.image);
TextView title = (TextView) view.findViewById(R.id.title);
TextView content = (TextView) view.findViewById(R.id.content);
ItemBean itemBean = itemBeanList.get(position);
image.setImageResource(itemBean.ItemImageId);
title.setText(itemBean.ItemTitle);
content.setText(itemBean.ItemContent);
return view;
}
這種方法簡單粗暴。每次都是重新inflate一個view,卻沒有充分利用好ListView的回收機制。用于簡單布局時還好,但對于復雜布局時性能就會大大下降。方法2就充分利用了這一點。
2、先判斷convertView為空時才重新inflate
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
convertView = inflator.inflate(R.layout.item, null);
}
ImageView image = (ImageView) convertView.findViewById(R.id.image);
TextView title = (TextView) convertView.findViewById(R.id.title);
TextView content = (TextView) convertView.findViewById(R.id.content);
ItemBean itemBean = itemBeanList.get(position);
image.setImageResource(itemBean.ItemImageId);
title.setText(itemBean.ItemTitle);
content.setText(itemBean.ItemContent);
return convertView;
}
仔細觀察會發現,每次getView都會重新findViewById。這同樣會降低性能。此時可利用一個ViewHolder對find的組件進行存儲。
3、先定義一個ViewHolder,用于存儲組件。convertView為空時,就inflate并find組件,并將find的組件用setTag存放到ViewHolder中。不為空時,getTag方法取出ViewHolder。
class ViewHolder {
public ImageView image;
public TextView title;
public TextView content;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = inflator.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
viewHolder.title = (TextView) convertView.findViewById(R.id.title);
viewHolder.content = (TextView) convertView.findViewById(R.id.content);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
ItemBean itemBean = itemBeanList.get(position);
viewHolder.image.setImageResource(itemBean.ItemImageId);
viewHolder.title.setText(itemBean.ItemTitle);
viewHolder.content.setText(itemBean.ItemContent);
return convertView;
}
不怕浪費時間的話,可以獲取開始加載和加載完成時的時間差,就會發現方法3性能時最好的。因此開發時推薦用該方法。
具體源碼
1、item的布局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"
android:padding="5dip">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
android:id="@+id/image"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="標題"
android:textSize="20sp"
android:layout_toRightOf="@+id/image"
android:gravity="center"
android:id="@+id/title"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="內容"
android:layout_below="@+id/title"
android:layout_toRightOf="@+id/image"
android:gravity="left"
android:id="@+id/content"/>
</RelativeLayout>
2、ItemBean,用于對item中組件進行包裝
public class ItemBean {
public int ItemImageId;
public String ItemTitle;
public String ItemContent;
public ItemBean(int itemImageId, String itemTitle, String itemContent) {
super();
ItemImageId = itemImageId;
ItemTitle = itemTitle;
ItemContent = itemContent;
}
}
3、MainActivity
public class MainActivity extends Activity{
private ListView listView;
private List<ItemBean> itemBeanList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lv);
itemBeanList = new ArrayList<ItemBean>();
for(int i=0;i<10;i++){
itemBeanList.add(new ItemBean(
R.drawable.ic_launcher,
"標題"+(i+1),
"內容"+(i+1)));
}
listView.setAdapter(new ListViewAdapter(itemBeanList,this));
}
}
4、ListViewAdapter
public class ListViewAdapter extends BaseAdapter{
private List<ItemBean> itemBeanList;
private Context context;
private LayoutInflater inflator;
public ListViewAdapter(List<ItemBean> itemBeanList,Context context) {
super();
this.itemBeanList = itemBeanList;
this.context = context;
inflator = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return itemBeanList.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return itemBeanList.get(arg0);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = inflator.inflate(R.layout.item, null);
viewHolder = new ViewHolder();
viewHolder.image = (ImageView) convertView.findViewById(R.id.image);
viewHolder.title = (TextView) convertView.findViewById(R.id.title);
viewHolder.content = (TextView) convertView.findViewById(R.id.content);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
ItemBean itemBean = itemBeanList.get(position);
viewHolder.image.setImageResource(itemBean.ItemImageId);
viewHolder.title.setText(itemBean.ItemTitle);
viewHolder.content.setText(itemBean.ItemContent);
return convertView;
}
class ViewHolder {
public ImageView image;
public TextView title;
public TextView content;
}
}