有时候系统提供的Adapter没法知足用户的需求,这就须要用户本身定义本身的Adapter。下面咱们直接经过一个例子来看一下自定义Adapter的用法。java
main.xml文件:android
<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" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </RelativeLayout>
cell.xml文件:缓存
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/ce_im" android:layout_gravity="left" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/ce_tv" android:layout_width="wrap_content" android:layout_gravity="center_vertical" android:layout_height="wrap_content" /> </LinearLayout>
上面咱们定义了两个xml文件。主Xml文件中放一个ListView。cell.xml中定义一个ImageView和TextView。ide
下面轮到自定义Adapter的编写了。函数
MyAdapter.java布局
public class MyAdatpter extends BaseAdapter{ /** *listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值获得listView的长度,而后根据这个长度,调用getView()逐一绘制每一行。 *若是你的getCount()返回值是0的话,列表将不显示一样return 1,就只显示一行。 */ private Context context; private int[] inStr; private String[] data; public MyAdatpter(Context context,int[] inStr,String[] data) { this.context = context; this.inStr=inStr; this.data=data; } //返回一个视图 @Override public View getView(int arg0, View arg1, ViewGroup arg2) { //建立Holter ViewHolter holter=new ViewHolter(); //若是缓存arg1为空,则须要建立View if (arg1==null) { //根据context上下文加载布局 /** * LayoutInflater是用来找layout下xml布局文件而且实例化 * findViewById()用来在xml布局中找控件id */ arg1=LayoutInflater.from(context).inflate(R.layout.cell, null); //加载布局 holter.p_w_picpathView =(ImageView)arg1.findViewById(R.id.ce_im); holter.textView =(TextView)arg1.findViewById(R.id.ce_tv); holter.p_w_picpathView.setImageResource(inStr[arg0]); holter.textView.setText(data[arg0]); //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag arg1.setTag(holter); }else { holter=(ViewHolter)arg1.getTag(); holter.p_w_picpathView =(ImageView)arg1.findViewById(R.id.ce_im); holter.textView =(TextView)arg1.findViewById(R.id.ce_tv); holter.p_w_picpathView.setImageResource(inStr[arg0]); holter.textView.setText(data[arg0]); } return arg1; } /** *ViewHolder不是Android的API或类,而是一种设计方法,是自定义的一个静态类,缓存一下,免得Listview更新的时候,还要从新操做。 */ public static class ViewHolter{ TextView textView; ImageView p_w_picpathView; } //在此适配器中所表明的数据集中的条目数 @Override public int getCount() { return inStr.length; } //获取数据集中与指定索引对应的数据项 @Override public Object getItem(int position) { return data[position]; } //获取在列表中与指定索引对应的行id @Override public long getItemId(int position) { return position; } }
MainActivity.javathis
public class MainActivity extends Activity { private ListView listView; private String[] data={"一号","二号","三号"}; private int[] p_w_picpathId={R.drawable.bomb1,R.drawable.bomb2,R.drawable.bomb3}; private MyAdatpter adatpter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(ListView)findViewById(R.id.lv); adatpter=new MyAdatpter(this, p_w_picpathId, data); listView.setAdapter(adatpter); } }
运行结果:设计