下面三段代码实现了三个Adapter,CursorAdapter,BaseAdapter,多类型List的Adapter。
首先是CursorAdapter是针对数据库和Content Provider的一种Adapter(一般使用Content Provider也是使用数据库的操作,因此会返回Cursor)
1 import android.app.Activity; 2 import android.content.Context; 3 import android.database.Cursor; 4 import android.provider.ContactsContract; 5 import android.view.View; 6 import android.view.ViewGroup; 7 import android.widget.CursorAdapter; 8 import android.widget.TextView; 9 10 public class CustomCursorAdapter extends CursorAdapter { 11 12 private Context mContext; 13 14 public CustomCursorAdapter(Context context, Cursor c) { 15 super(context, c, false); 16 mContext=context; 17 } 18 19 @Override 20 public View newView(Context context, Cursor cursor, ViewGroup parent) { 21 return ((Activity)mContext).getLayoutInflater().inflate(R.layout.cursor_item,parent,false); 22 } 23 24 @Override 25 public void bindView(View view, Context context, Cursor cursor) { 26 TextView textView=(TextView)view.findViewById(R.id.text); 27 textView.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))); 28 } 29 }
上述两个Override方法是必须实现的。
然后是BaseAdapter的使用方法,这个适合自定义模型的现实,比较灵活,同时也是上述CursorAdapter和多类型显示List Adapter的一个基类,下面代码是一种基本实现
1 import android.app.Activity; 2 import android.content.Context; 3 import android.view.View; 4 import android.view.ViewGroup; 5 import android.widget.BaseAdapter; 6 import android.widget.TextView; 7 8 import java.util.ArrayList; 9 10 public class CustomBaseAdapter<T> extends BaseAdapter{ 11 12 private ArrayList<T> mArrayList=new ArrayList<T>(); 13 private Context mContext; 14 15 public CustomBaseAdapter(Context context,ArrayList<T> entries) { 16 mContext=context; 17 mArrayList=entries; 18 } 19 20 @Override 21 public int getCount() { 22 return mArrayList.size(); 23 } 24 25 @Override 26 public T getItem(int position) { 27 return mArrayList.get(position); 28 } 29 30 @Override 31 public long getItemId(int position) { 32 return 0; 33 } 34 35 @Override 36 public View getView(int position, View convertView, ViewGroup parent) { 37 if(convertView==null){ 38 convertView=((Activity)mContext).getLayoutInflater().inflate(R.layout.list_item,parent,false); 39 } 40 T entry=getItem(position); 41 TextView textView=(TextView)convertView.findViewById(R.id.text); 42 textView.setText(entry.toString()); 43 return convertView; 44 } 45 }
最后实现的这个ListView是实现多个类型列表共存的一种Adapter,实际上就是使用判断语句来分别判断实例化哪一种布局实例和填充对象(这就用到了getView返回的View的多态性质)
1 public class DemoBaseAdapter extends BaseAdapter { 2 3 ArrayList<HashMap<String,Object>> ls=new ArrayList<HashMap<String, Object>>(); 4 Context mContext; 5 final int VIEW_TYPE=2; 6 final int TYPE_1=0; 7 final int TYPE_2=1; 8 9 private TextView text; 10 private LayoutInflater mInflater; 11 12 public DemoBaseAdapter(Context context,ArrayList<HashMap<String,Object>> ls) { 13 this.ls=ls; 14 mContext = context; 15 } 16 17 @Override 18 public int getCount() { 19 return 2; 20 } 21 22 @Override 23 public Object getItem(int position) { 24 return ls.get(position); 25 } 26 27 @Override 28 public long getItemId(int position) { 29 return 0; 30 } 31 32 @Override 33 public View getView(int position, View convertView, ViewGroup parent) { 34 int type=getItemViewType(position); 35 if(convertView==null){ 36 mInflater= LayoutInflater.from(mContext); 37 switch (type){ 38 case TYPE_1: 39 convertView=mInflater.inflate(R.layout.item_1, parent, false); 40 text = (TextView) convertView.findViewById(R.id.text); 41 break; 42 case TYPE_2: 43 convertView=mInflater.inflate(R.layout.item_2, parent, false); 44 text = (TextView)convertView.findViewById(R.id.text); 45 break; 46 } 47 }else { 48 switch (type){ 49 case TYPE_1: 50 text = (TextView)convertView.findViewById(R.id.text); 51 break; 52 case TYPE_2: 53 text = (TextView)convertView.findViewById(R.id.text); 54 break; 55 } 56 } 57 58 switch (type){ 59 case TYPE_1: 60 text.setText("Item1"); 61 break; 62 case TYPE_2: 63 text.setText("Item2"); 64 break; 65 } 66 return convertView; 67 } 68 69 @Override 70 public int getViewTypeCount() { 71 return VIEW_TYPE; 72 } 73 74 @Override 75 public int getItemViewType(int position) { 76 int type=-1; 77 switch (position){ 78 case 0: 79 type = TYPE_1; 80 break; 81 case 1: 82 type = TYPE_2; 83 break; 84 } 85 return type; 86 } 87 }
上面代码为了不使用模型层数据而在某些数据上作伪了,效果是:
总结一下,使用BaseAdapter作为基类可以实现比较灵活的布局设置,但是使用Cursor可以结合数据库和LoadCallbacks接口可以实现数据的异步查询和加载。
但是因为CursorAdapter也是从BaseAdapter所派生的,因此,使用BaseAdapter也是一种比较通用普遍的方法。
以上。
时间: 2024-10-17 03:14:44