有時候系統提供的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); } }
運行結果:設計