ListView之适配器

来源:互联网 发布:mac系统u盘制作 编辑:程序博客网 时间:2024/06/05 02:38

注:本文知识整理自Mooc的相关课程,主要整理适配器为:ArrayAdapter,SimpleAdapter,BaseAdapter.

.
ArrayAdapter

public class MainActivity extends Activity{    private ListView listView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 匹配布局文件中的ListView控件        listView = (ListView)findViewById(R.id.listView);        String[] data = new String[] { "java", "C++", "JavaScript", "Php","Python" };        /*        ArrayAdapter的数据源可为数组也可为是集合(参数不同),以下为数组的用例new ArrayAdapter<String>(context【上下文,Activity中的this】,textViewResourceId【ListView单列所对应的布局文件】, object【数据源数:数组或List】);        */        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);        // 给ListView设置数据适配器        listView.setAdapter(adapter);-------------------------------------------------------------R.layout.activity_main:只加了一个ListView的布局--------------------------------------------------------------R.Layout.simple_list_item_1:只加了一个TextView的布局--------------------------------------------------------------

.
SimpleAdapter

public class MainActivity extends Activity{    private ListView listView;    private SimpleAdapter simple_adapter;    private List<Map<String, Object>> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        listView = (ListView) findViewById(R.id.listView);        list = new List<Map<String, Object>>();/*new SimpleAdapter(context,data,resoureID,from,to)context:上下文,即ListView所在的Activity的this;data:数据源(只能是集合List<?extends Map<String,?>> data)一个Map所组成的List集合,每一个Map都会对应ListView列表中的一行。每一个Map(键-值)中的键必须包含所有在from中所指定的键resources:列表单列所对应的布局文件IDfrom:Map中的键名,即给resources中每个组件的ID取一个名字to:绑定数据视图中的ID,与from成对应关系,即:resources中每个组件的ID*/    simple_adapter = new SimpleAdapter(MainActivity.this,                                    getDate(),                                     R.layout.list_item,                          new String[] {"image","text"}                           new int[] { R.id.image,R.id.text}                          );    listView.setAdapter(simple_adapter);}private List<Map<String, Object>> getData() {        for(int i=0;i<20;i++){        Map<String, Object> map = new HashMap<String, Object>();        map.put("image",R.drawable.ic_launcher);        map.put("text","第"+i+"张图")        list.add(Map);        }        return list;    }-------------------------------------------------------------R.layout.activity_main:只加了一个ListView的布局-----------------------------------------------------------R.layout.list_item:-----------------------------------------------------------<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center_vertical"    android:orientation="horizontal" >    <ImageView        android:id="@+id/image"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp" />    <TextView        android:id="@+id/text"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:textSize="25sp" /></LinearLayout>

BaseAdapter
1.先创建两个Layout

-----------------------------------------------------------------activity_main为只添加一个ListView的布局文件-----------------------------------------------------------------item.xml:-----------------------------------------------------------------<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"     android:descendantFocusability="blocksDescendants"    ><ImageView     android:id="@+id/myimage"    android:layout_width="100dp"    android:layout_height="180dp"    android:paddingLeft="5dp"    android:src="@mipmap/littletubiao"    /><LinearLayout     android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    ><TextView    android:id="@+id/myname"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="20sp"     android:textColor="#f0f"    android:paddingLeft="10dp"    android:text="你还未命名"     /><TextView    android:id="@+id/mycontext"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="14sp"    android:paddingLeft="10dp"    /></LinearLayout></LinearLayout>

.
2.ItemBean(ListView单列内容的构造函数)

public class ItemBean {    public int ItemImageId;    public String Itemname;    public String Itemcontext; public ItemBean( int itemImageId,String itemname,String itemcontext){     ItemImageId=itemImageId;     Itemname=itemname;     Itemcontext=itemcontext;    }}

3.MainActivity

public class Picture extends Activitypublic void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        List<ItemBean> itemBeanList= new ArrayList<>();        for(i = 0;i<20;i++){            itemBeanList.add(new ItemBean(                R.mipmap.ic_launcher,                "我是标题"+i,                "我是内容"+i            ))        }        ListView list = (ListView) findViewById(R.id.mylist);        list.setAdapter(new MyAdapter(this, ItemBeanList););        }}

4.MyAdapter

public class MyAdapter extends BaseAdapter{     private LayoutInflater mLayoutInflater;     private List<ItemBean> myList;     public MyAdapter(Context context,List<ItemBean> list) {        myList=list;        mLayoutInflater=LayoutInflater.from(context);        //从Context中,获得一个布局填充器,这样你就可以使用这个填充器来把xml布局文件转为View对象了。         //mLayoutInflater布局装载器对象         //context:要使用当前Adapter的界面对象     }    //将适配器与ItemBean关联起来    @Override    public int getCount() {        //即ListView所需要显示的数据的数量(列的数量),即list的大小        return myList.size();    }    @Override    public Object getItem(int position) {        //获取数据集中及指定索引对应的数据项        return myList.get(position);    }    @Override    public long getItemId(int position) {        //获得指定行对应的id        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder = null;//利用ListView的缓存机制,避免每次刷新都重新重新创建一个View,造成浪费,当convertView为空时才创建。      if (convertView == null) {          holder = new ViewHolder();//       由于我们只需要将XML转化为View,并不涉及到具体的布局,所以第二个参数通常设置为null//通过holder避免多次使用findViewById而造成浪费,将Hold与convertView相关联后,之后只需通过convertView.getTag()即可获取相应控件(无需再次创建)          convertView = mLayoutInflater.inflate(R.layout.item, null);          holder.img = (ImageView) convertView.findViewById(R.id.myimage);          holder.title = (TextView) convertView.findViewById(R.id.myname);          holder.content = (TextView) convertView.findViewById(R.id.mycontext);          convertView.setTag(holder);      } else {          holder = (ViewHolder) convertView.getTag();      }//       取出bean对象      ItemBean bean = myList.get(position);//       设置控件的数据      holder.img.setImageBitmap(bean.ItemImage);      holder.title.setText(bean.Itemname);      holder.content.setText(bean.Itemcontext);      return convertView;     //返回ListView单列显示的内容  }    }class ViewHolder{    public ImageView img;    public TextView title;    public TextView content;}

注:LayoutInflater在Android中是“扩展”的意思,作用类似于findViewById(),不同的是LayoutInflater是用来获得布局文件对象的,而findViewById()是用来获得具体控件的。
LayoutInflater经常在BaseAdapter的getView方法中用到,用来获取整个View并返回。

原创粉丝点击