您的位置:首页 > 移动开发 > Android开发

Android adapter初步介绍

2013-05-16 20:32 399 查看
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", "test
4000
2", "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(待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: