Android adapter 介绍
1. 什么是Adapter
引用google API的话语:
An Adapter objectacts as a bridge between an AdapterView and the underlying data for that view.The Adapter provides access to the data items. The Adapter is also responsiblefor making a View for each item in the data set.
即:Adapter是view和data之间的桥梁
2. Adapter接口及其衍生类
大部分抽象方法都是Adapter接口提供的,其衍生的2个接口:
(1) ListAdapter
abstract boolean areAllItemsEnabled()
abstract boolean isEnabled(intposition)
(2) SpinnerAdapter
abstract View getDropDownView(intposition, View convertView, ViewGroup parent)
3. BaseAdapter(常用adapter类一)
(1) BaseAdapter实现了一些不常用的接口,给予默认值
<1> publicboolean hasStableIds() 组和子元素是否持有稳定的ID,也就是底层数据的改变不会影响到它们(不懂)
<2> registerDataSetObserver unregisterDataSetObserver notifyDataSetChanged notifyDataSetInvalidated 类似与数据改变时通知(具体怎么用)
<3> boolean areAllItemsEnabled() 是否所有items都是可用的
<4> boolean isEnabled(intposition) 如果某个item不是separate则返回true
<5> View getDropDownView(intposition, View convertView, ViewGroup parent) 定义一个试图的下拉子试图(待续)
<6> intgetViewTypeCount() 同一个listview的view item可能包含多种不同的layout,返回layout的种数
<7> int getItemViewType(intposition) 返回某一position使用哪种layout, 最终还是要在getView中根据此参数对convertView赋不同的值,所以这2个方法意义不大
<8> booleanisEmpty() 返回此adapter是否为空 即getCount() == 0
(2) 具体使用示例:
自定义adapter类:
public class CustomAdapter extends BaseAdapter{
ArrayList<CustomData> mData;
private LayoutInflater mInflater;
ImageView mImageView;
TextView mTextView;
public CustomAdapter(ArrayList<CustomData> data, Context context) {
this.mData = data;
this.mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
//返回adapter总共有多少项数据(可以直接返回0)
return mData.size();
}
@Override
public Object getItem(int position) {
//返回adapter 某一项具体的数据(可以直接返回null)
return mData.get(position);
}
@Override
public long getItemId(int position) {
/**(可以直接返回0)
* position: The position of the view in the adapter.
* id: The row id of the item that was clicked.
* 在大部分adapter中,position == id
* 但是在HeaderViewListAdapter中,如果position指向了headerView或footerView,那么返回-1,否则,将返回在用户view数组的位置
*/
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//返回某一位置的具体view
if(convertView == null) {
convertView = mInflater.inflate(R.layout.list_view, null);
mImageView = (ImageView)convertView.findViewById(R.id.imageview);
mTextView = (TextView)convertView.findViewById(R.id.textivew);
}
mImageView.setBackgroundResource(mData.get(position).getImageView());
mTextView.setText(mData.get(position).getTextView());
return convertView;
}
}
主要就是实现getView方法,来返回自定义的view给list item
这儿引用的R.layout.list_view就是一个完整的layout
使用方法:
mCustomAdapter = new CustomAdapter(mData, getApplicationContext());
mListView.setAdapter(mCustomAdapter);
其中mData可以看做是存储数据的集合
4. SimpleAdapter(常用adapter类二)
(1) 定义了一个简单的adapter,可以使用自定义的xml布局和arraylist参数,构建adapter对象供listview使用.可以传递各种类型的参数
构造方法:
SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
其中data是传入的数据,resource是布局,from是取data中的参数的key,to是依次被赋值的对象.
(2) 具体使用示例:
初始化data:private List<Map<String, Object>> getSimpleData() {
List<Map<String, Object>> mList = new ArrayList<Map<String,Object>>();
Map<String, Object> mMap = new HashMap<String, Object>();
mMap.put("text","This is SimpleAdapter 0");
mMap.put("image", R.drawable.ic_launcher);
mList.add(mMap);
//...... other data
return mList;
}
使用方法:
mSimpleAdapter = new SimpleAdapter(getApplicationContext(), getSimpleData(), R.layout.list_view, new String[]{"image", "text"}, new int[]{R.id.imageview, R.id.textivew});
mListView.setAdapter(mSimpleAdapter);
5. ArrayAdapter(常用adapter类三)
(1) 顾名思义,就是这种adapter只能传递字符串参数,不能传递其他对象参数,使用也较SimpleAdapter简单些
构造方法:
ArrayAdapter(Context context, int textViewResourceId)
ArrayAdapter(Context context, int resource, int textViewResourceId)
ArrayAdapter(Context context, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
ArrayAdapter(Context context, int textViewResourceId, List<T> objects)
ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
textViewResourceId:textview布局的id
objects传入的数据集合
(2) 具体使用示例:
String[] mArrayData = {"test1", "test2", "test3", "test4"};
mArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.arraylist_textview, mArrayData);
mListView.setAdapter(mArrayAdapter);
其中arraylist_textview.xml文件并不是一个Layout,而是一个TextView:
ex:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</TextView>
6. SimpleCursorAdapter(常用adapter类四)
这个和SimpleAdapter有点像,传入的参数最终只能是字符串参数,但是传入的参数并不是一个字符串数组,而是一个Cursor对象,所以当读取数据库数据并显示出来的时候使用这种适配器比较方便.(这个也可以传递其他参数,但是要重载这个类,待续)
构造函数:
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)
使用示例:
Cursor cur = getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
startManagingCursor(cur);
mSimpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.arraylist_textview, cur, new String[] {ContactsContract.Contacts.DISPLAY_NAME}, new int[] {R.id.textivew});
mListView.setAdapter(mSimpleCursorAdapter);
7. HeaderViewListAdapter(待续)