Android -- ListView (2)

有時候系統提供的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);     
    }
}

運行結果:設計

相關文章
相關標籤/搜索