標籤:
之前接觸了ListView和Adapter,Adapter將資料來源和View串連起來,實際應用中,我們要顯示的資料往往有很多,而螢幕只有那麼大,系統只能螢幕所能顯示的內容,當我們滑動螢幕,會將舊的內容放入到緩衝池中,再從緩衝池中拿出新的內容顯示出來,這就是ListView的緩衝機制,這一機制可以極大的節省系統資源。
BaseAdapter
BaseAdapter通常用於被擴充,擴充BaseAdapter可以對各項列表進行最大限度的定製。
我們可以用自己的類去繼承BaseAdapter,然後實現getCount()、getItem()、getItemId()、getView()這四個方法,來完成對Adapter的定製。
getCount() 該方法返回ListView需要顯示的資料量
getItem() 該方法返回指定索引(position)所對應的資料項目
getItemId() 該方法返回對應的索引
getView() 該方法返回每一項所顯示的內容
簡單樣本:
package cn.lixyz.baseadaptertest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { List<ItemBean> itemBeanList; ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); itemBeanList = new ArrayList<ItemBean>(); for (int i = 0; i < 20; i++) { ItemBean ib = new ItemBean(R.drawable.icon, "標題" + i, "內容" + i); itemBeanList.add(ib); } listView = (ListView) findViewById(R.id.listView); listView.setAdapter(new MyAdapter(this, itemBeanList)); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(MainActivity.this, "你選擇的是:" + position, Toast.LENGTH_SHORT).show(); } }); }}MainActivity.java
<LinearLayout 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" android:orientation="vertical" tools:context=".MainActivity"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
layout_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" android:orientation="vertical"> <ImageView android:id="@+id/iv_icon" android:layout_width="60dp" android:layout_height="60dp" android:layout_marginLeft="10dp" android:layout_marginTop="10dp" android:src="@drawable/icon" /> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="35dp" android:layout_marginTop="10dp" android:layout_toEndOf="@+id/iv_icon" android:gravity="center" android:text="標題" android:textSize="25dp" /> <TextView android:id="@+id/tv_desc" android:layout_width="match_parent" android:layout_height="25dp" android:layout_below="@+id/tv_name" android:layout_marginLeft="10dp" android:layout_toEndOf="@+id/iv_icon" android:gravity="center" android:text="內容內容內容內容" /></RelativeLayout>
layout_item.xml
package cn.lixyz.baseadaptertest;/** * Created by LGB on 2015/9/9. */public class ItemBean { public int ItemImageResid; public String ItemName; public String Itemdesc; public ItemBean(int ItemImageResid, String ItemName, String Itemdesc) { this.ItemImageResid = ItemImageResid; this.ItemName = ItemName; this.Itemdesc = Itemdesc; }}ItemBean.java
package cn.lixyz.baseadaptertest;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;/** * Created by LGB on 2015/9/9. */public class MyAdapter extends BaseAdapter { private List<ItemBean> list; private LayoutInflater inflater; public MyAdapter(Context context, List<ItemBean> list) { this.list = list; inflater = LayoutInflater.from(context); } //該方法返回ListView需要顯示的資料量 @Override public int getCount() { return list.size(); } //該方法返回指定索引(position)所對應的資料項目 @Override public Object getItem(int position) { return list.get(position); } //該方法返回對應的索引 @Override public long getItemId(int position) { return 0; } // @Override public View getView(int position, View convertView, ViewGroup parent) { View view = inflater.inflate(R.layout.laytou_item, null); ImageView imageView = (ImageView) view.findViewById(R.id.iv_icon); TextView name = (TextView) view.findViewById(R.id.tv_name); TextView desc = (TextView) view.findViewById(R.id.tv_desc); imageView.setImageResource(list.get(position).ItemImageResid); name.setText(list.get(position).ItemName); desc.setText(list.get(position).Itemdesc); return view; }}MyAdapter
運行結果:
上面的代碼中,我們可以看到一個ListView中的每一項都是我們直接使用Inflater建立並返回的,完全沒有使用到ListView提供的緩衝機制
View view = inflater.inflate(R.layout.laytou_item, null);......return view;
有關inflater的內容,可以看這裡:<轉> Android LayoutInflater詳解 Android 中LayoutInflater的使用
Android筆記(二十五) ListView的緩衝機制與BaseAdapter