Android adapter初步介绍

来源:互联网 发布:淘宝9块9包邮报名资格 编辑:程序博客网 时间:2024/05/19 19:31

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);}@Overridepublic int getCount() {//返回adapter总共有多少项数据(可以直接返回0)return mData.size();}@Overridepublic Object getItem(int position) {//返回adapter 某一项具体的数据(可以直接返回null)return mData.get(position);}@Overridepublic 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;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//返回某一位置的具体viewif(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 datareturn 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(待续)

原创粉丝点击