以前在用到BaseAadpter显示ListView、GridView、Spinner的时候,直接把网上现成的代码拿过来copy一下,然后修修改改就好了,一直也没有详细地总结一下,今天亲自动手写写,发现还是有不少问题的,先上个图看一下这个程序的运行结果:
利用listview在界面上显示,根据不同的位置,显示不同的图片和文字。
第一步:在建立好工程后,首先来看看主类,BaseAdapterDemoActivity
package com.my; import android.app.Activity; import android.os.Bundle; import android.widget.ListView; public class BaseAdapterDemoActivity extends Activity { private DemoAdapter adapter = null; private ListView myListView = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setView(); } private void setView() { myListView = (ListView) findViewById(R.id.my_listview); adapter = new DemoAdapter(this); myListView.setAdapter(adapter); } }
这个BaseAdapterDemoActivity很简单,就是new一个适配器,然后把适配器放到listview当中。
第二步:BaseAdapterDemoActivity的布局文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_linearlayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ListView android:id="@+id/my_listview" android:layout_width="fill_parent" android:layout_height="wrap_content" > </ListView> <!--<GridView android:id="@+id/my_gridview" android:layout_width="fill_parent" android:layout_height="wrap_content" > </GridView> <Spinner android:id="@+id/my_spinner" android:layout_width="fill_parent" android:layout_height="wrap_content" > </Spinner> --></LinearLayout>
第三步:为要绘制的每一个条目创建一个布局文件,item_list.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/myimageview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/icon" > </ImageView> <TextView android:id="@+id/mytext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/name" /> </LinearLayout>
最后一步:也是关键所在,BaseAdapter
package com.my; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class DemoAdapter extends BaseAdapter { private Context c = null; private LayoutInflater myInflater = null; /** * 构造函数 * @param myContext */ public DemoAdapter(Context myContext) { c = myContext; } @Override public int getCount() { // TODO Auto-generated method stub return 6; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } /** * 这个方法getView(),是用来逐一绘制每一条item * * setTag()会把View与ViewHolder绑定,形成一一对应的关系,拖动listview的时候会重新绘制每一条item * 但是那些已经取得绑定的View,会调用getTag()方法,就不会重新绘制,而是拿到内存中已经取得的资源,提高了效率 * * @param position position就是位置从0开始 * @param convertView convertView是Spinner,ListView中每一项要显示的view * @param parent parent就是父窗体了,也就是Spinner,ListView,GridView了 * @return 通常return 的view也就是convertView */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = new ViewHolder(); if (convertView == null) { /** * 在程序中动态加载以上布局: * LayoutInflater flater = LayoutInflater.from(this); * View view = flater.inflate(R.layout.example, null); */ myInflater = LayoutInflater.from(c); convertView = myInflater.inflate(R.layout.item_list, null); holder.icon = (ImageView) convertView .findViewById(R.id.myimageview); holder.text = (TextView) convertView.findViewById(R.id.mytext); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position <= 1) { holder.icon.setImageResource(R.drawable.icon); holder.text.setText(R.string.text1); } else if (position <= 3 && position >= 2) { holder.icon.setImageResource(R.drawable.icon_b); holder.text.setText(R.string.text2); } else { holder.icon.setImageResource(R.drawable.icon_c); holder.text.setText(R.string.text3); } return convertView; } private class ViewHolder { TextView text; ImageView icon; } }
在这段代码中有几点还是需要特别提出来:
1.构造函数public DemoAdapter(Context myContext)可以不用创建,这个创建是因为LayoutInflater需要一个Context;
2.方法public int getCount()是用来说明需要绘制的条目数量,这里是6条;
3.方法public View getView(int position, View convertView, ViewGroup parent)用来逐条绘制,也就是说每绘制一个条目就调用一次这个方法;
4.setTag() getTag()等在代码的注释中加了解释。