Adapter接口及其实现类

来源:互联网 发布:佛山淘宝客服外包 编辑:程序博客网 时间:2024/05/21 07:12

Adapter是用来帮助填充AdapterView数据中间桥梁,通过它可以为ListView GridView Gallery填充数据以及布局样式。Adapter本身是一个接口,由它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为AbsSpinner提供列表项。在实际使用中比较常用的主要有以下几个Adapter。

ArrayAdaptet:简单易用,通常用于将数组或List集合的多个值包装成多个列表项。

SimpleAdapter:功能强大,可将List集合的多个对象包装成多个列表项。

SimpleCursorAdapter:只是用于包装Cursor提供的数据。

BaseAdapter:可以对个列表项进行最大限度的定制。

以上Adapte都是继承了BaseAdapter,而BaseAdapter同时实现了ListAdapter和SpinnerAdapter两个接口。因此它们都可以为AbsListView和AbsSpinner提供列表项。

ArrayAdapter使用样例代码:

public class ArrayAdapterTest extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);ListView list1 = (ListView) findViewById(R.id.list1);// 定义一个数组String[] arr1 = { "孙悟空", "猪八戒", "牛魔王" };// 将数组包装ArrayAdapterArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, R.layout.array_item, arr1);// 为ListView设置Adapterlist1.setAdapter(adapter1);}}
创建ArrayAdapter必须指定如下三个参数

context:上下文环境。

textViewResourceId:一个资源Id,该资源IId代表一个TextView作为ArrayAdapter的列表项组件。

数组或List:负责为做个列表项提供数据。


SimpleAdapter使用样例代码:

public class SimpleAdapterTest extends Activity{private String[] names = new String[]{ "虎头", "弄玉", "李清照", "李白"};private String[] descs = new String[]{ "可爱的小孩", "一个擅长音乐的女孩", "一个擅长的文学的女性", "浪漫主义诗人"};private int[] imageIds = new int[]{ R.drawable.tiger , R.drawable.nongyu, R.drawable.qingzhao , R.drawable.libai};@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 创建一个List集合,List集合的元素是MapList<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();for (int i = 0; i < names.length; i++){Map<String, Object> listItem = new HashMap<String, Object>();listItem.put("header", imageIds[i]);listItem.put("personName", names[i]);listItem.put("desc", descs[i]);listItems.add(listItem);}// 创建一个SimpleAdapterSimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,R.layout.simple_item, new String[] { "personName", "header" , "desc"},new int[] { R.id.name, R.id.header , R.id.desc });ListView list = (ListView) findViewById(R.id.mylist);// 为ListView设置Adapterlist.setAdapter(simpleAdapter);// 为ListView的列表项单击事件绑定事件监听器list.setOnItemClickListener(new OnItemClickListener(){// 第position项被单击时激发该方法。@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id){System.out.println(names[position]+ "被单击了");}});list.setOnItemSelectedListener(new OnItemSelectedListener(){// 第position项被选中时激发该方法。@Overridepublic void onItemSelected(AdapterView<?> parent, View view,int position, long id){System.out.println(names[position]+ "被选中了");}@Overridepublic void onNothingSelected(AdapterView<?> parent){}});}}
在生成SimpleAdapter对象是需要指定5个参数分别为

congtext:上下文环境

第二个:该参数应该是一个List<? extends Map<String,?>>类型的集合对象,该集合中的每一个Map<String,?>对象生成一个列表项。

第三个:指定一个界面布局的Id。例如上文代码中指定了R.laoyout.simple_item,意味着每一个列表项组件都是/res/layout/simple_item.

第四个:一个String[]类型的参数,该参数决定提取Map<String,?>中的那些key对应的value来生成列表项。

第五个:int[]类型参数,该参数决定填充哪些组件。一般情况下都为第三个参数所代表的布局文件中的View的Id。

上文代码中还出现了OnItemClickListener和OnItemSelectedListener两个监听方法,它们都是来自于AdapterView,用于监听列表项的单击事件。


BaseAdapter使用样例代码:

public class BaseAdapterTest extends Activity{ListView myList;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);myList = (ListView) findViewById(R.id.myList);BaseAdapter adapter = new BaseAdapter(){@Overridepublic int getCount(){// 指定一共包含40个选项return 40;}@Overridepublic Object getItem(int position){return null;}// 重写该方法,该方法的返回值将作为列表项的ID@Overridepublic long getItemId(int position){return position;}// 重写该方法,该方法返回的View将作为列表框@Overridepublic View getView(int position, View convertView , ViewGroup parent){// 创建一个LinearLayout,并向其中添加2个组件LinearLayout line = new LinearLayout(BaseAdapterTest.this);line.setOrientation(0);ImageView image = new ImageView(BaseAdapterTest.this);image.setImageResource(R.drawable.ic_launcher);TextView text = new TextView(BaseAdapterTest.this);text.setText("第" + (position +1 ) + "个列表项");text.setTextSize(20);text.setTextColor(Color.RED);line.addView(image);line.addView(text);// 返回LinearLayout实例return line;}};myList.setAdapter(adapter);}}
代码中创建了一个BaseAdapter对象,扩展该对象需要重写如下四个方法

getCount() :返回值即为该Adapter中包含多少列表项。

getItem(int position) :该方法的返回值决定地position处的列表项的内容。

getItemId(int position) :返回值即为第position处的列表项的Id。

getView(int position, View convertView, ViewGroup parent) :该方法返回值决定第position处的列表项组件。


注:在使用ListView过程中如果界面中只有一个ListView,则可以让Ativity直接继承ListActivity,该子类无需调用setContentView()来显示某个界面,而是可以直接传入一个包含内容的Adapter。如果在该子类中要调用setContentView()来设置自定义的布局,则该布局文件中必须要包含一个Id为"@+id/android:list"的ListView。


0 0
原创粉丝点击