Android-adapter的用法

来源:互联网 发布:ubuntu安装gnome2 编辑:程序博客网 时间:2024/05/23 16:19

参考:http://blog.csdn.net/kenkao/article/details/8607012

            http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html


1.ArrayAdapter的使用

ArrayAdapter 通常每一行显示一条数据

1)使用系统自定义布局文件显示数据

ArrayAdapter的构造函数:public ArrayAdapter(Context context,int resource,List<T> objects)

需要传递三个参数,context上下文、布局文件,数据源

//创建activity继承于ListActivitypublic class MainActivity extends ListActivity {protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);List<String> list=new ArrayList<String>();list.add("1");list.add("2");//三个参数依次为当前对象this,显示数据的布局文件(此处使用系统定义的一个布局文件),数据源ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,list);setListAdapter(adapter);}}



2)自定义布局文件显示数据

构造函数

public ArrayAdapter(Context context,int resource,int textViewResourceId,List<T> objects)
需要传递四个参数,context上下文、自定义布局文件,自定义布局文件中控件的id,数据源

protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//String[] strs={"1","2","3"};List<String> list=new ArrayList<String>();list.add("1");list.add("2");//此处使用自定义布局文件,参数依次为this,自定义布局文件,自定义布局文件中控件的id,数据源ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.arrary_adapter,R.id.textView,list);setListAdapter(adapter);}

自定义布局文件array_adapter.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.androidtest.MainActivity" >    <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        /></RelativeLayout>



2.SimpleAdapter

SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局。

构造函数:SimpleAdapter(Context context,List<? extendsMap<String, ?>> data, int resource,String[] from, int[] to)

Parameters:

context The context where the View associated with this SimpleAdapter is running
data A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"
resource Resource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"
from A list of column names that will be added to the Map associated with each item.
to The views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.


public class MainActivity extends ListActivity {protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//创建simpleadapter,参数依次为this,数据源,//自定义显示数据的布局文件,//一个字符串数组,存放的是map中对应的键,会根据这里的key在map获取对应的值放入布局文件中对应的控件中//整型数组,根据布局文件中控件id找到对应的控件,对应的是字符数组中的key,再根据key获取数据放入控件SimpleAdapter adapter = new SimpleAdapter(this, getData(),R.layout.simple_adapter,new String[] { "img", "title", "info" }, new int[] { R.id.img,R.id.title, R.id.info });setListAdapter(adapter);}public List<HashMap<String, Object>> getData() {// 创建一个List,用来保存每一行数据List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();// list中存放的是hashmap类型的值,每一个map中保存着一行数据中所有内容的键值对HashMap<String, Object> map1 = new HashMap<String, Object>();// 添加第一行数据中的内容map1.put("title", "google");map1.put("img", R.drawable.ic_launcher);map1.put("info", "google info");// 将第一行内容放入listlist.add(map1);// 第二行数据内容HashMap<String, Object> map2 = new HashMap<String, Object>();map2.put("title", "android");map2.put("img", R.drawable.ic_launcher);map2.put("info", "android info");list.add(map2);return list;}}

simple_adapter.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="5dp"         />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="vertical" >        <TextView            android:id="@+id/title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="20sp" />        <TextView            android:id="@+id/info"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="12sp" />    </LinearLayout></LinearLayout>


3.BaseAdapter

有时候需要添加一个按钮,但是按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,所以考虑自定义类然后继承于BaseAdapter。

public class MainActivity extends ListActivity {private List<HashMap<String, Object>> list;protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);list=getData();MyAdapter adapter=new MyAdapter(this);setListAdapter(adapter);}public List<HashMap<String, Object>> getData() {// 创建一个List,用来保存每一行数据ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();// list中存放的是hashmap类型的值,每一个map中保存着一行数据中所有内容的键值对HashMap<String, Object> map1 = new HashMap<String, Object>();// 添加第一行数据中的内容map1.put("title", "google");map1.put("img", R.drawable.ic_launcher);map1.put("info", "google info");// 将第一行内容放入listlist.add(map1);// 第二行数据内容HashMap<String, Object> map2 = new HashMap<String, Object>();map2.put("title", "android");map2.put("img", R.drawable.ic_launcher);map2.put("info", "android info");list.add(map2);return list;}public class MyAdapter extends BaseAdapter{//LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化private LayoutInflater mInflater;//构造函数public MyAdapter(Context context){//获取inflater实例this.mInflater = LayoutInflater.from(context);}//从list获取数据的条数,得到数据的行数public int getCount() {// TODO Auto-generated method stubreturn list.size();}//根据当前位置position获取当前行的数据对象public Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}//获取当前位置positionpublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder=null;//covertView是从布局文件中inflate来的布局,如果为空,从inflater中inflate布局文件if(convertView==null){holder=new ViewHolder();//获取自定义布局文件convertView=mInflater.inflate(R.layout.base_adapter, null);//实例化控件holder.img = (ImageView)convertView.findViewById(R.id.img);holder.title = (TextView)convertView.findViewById(R.id.title);holder.info = (TextView)convertView.findViewById(R.id.info);holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);convertView.setTag(holder);}else{holder=(ViewHolder) convertView.getTag();}//为控件设置属性holder.img.setBackgroundResource((Integer)list.get(position).get("img"));holder.title.setText((String)list.get(position).get("title"));holder.info.setText((String)list.get(position).get("info")); holder.viewBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {System.out.println("click.....");} });return convertView;}//自定义一个ViewHolder,里边包含自定义布局文件中的控件public class ViewHolder{public ImageView img;public TextView title;public TextView info;public Button viewBtn;}}}

convertView == null  的时候,如果为空,就会根据设计好的自定义布局base_adapter.xml,来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。

如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。


base_adapter.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="5dp"         />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="vertical" >        <TextView            android:id="@+id/title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="20sp" />        <TextView            android:id="@+id/info"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textSize="12sp" />    </LinearLayout>    <Button         android:id="@+id/view_btn"         android:layout_width="wrap_content"          android:layout_height="wrap_content"        android:text="click"  /></LinearLayout>

Listview和Adapter:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html


0 0
原创粉丝点击