天天看點

Android--自定義Listview

版權聲明:本文為部落客原創文章,轉載請标明出處。 https://blog.csdn.net/chaoyu168/article/details/53895168

DEMO下載下傳:

http://download.csdn.net/detail/chaoyu168/9722375

程式将實作一個使用自定義的擴充卡(Adapter)綁定 

資料,通過contextView.setTag綁定資料有按鈕的ListView。 

系統顯示清單(ListView)時,首先會執行個體化一個擴充卡,本文将執行個體化一個自定義的擴充卡。實作 

自定義擴充卡,必須手動映射資料,這時就需要重寫getView()方法,系統在繪制清單的每一行的時候 

将調用此方法。 

ListView在開始繪制的時候,系統自動調用getCount()函數,根據函數傳回值得到ListView的長度, 

然後根據這個長度,調用getView()逐一畫出每一行。 

具體使用方法可以參考下面代碼,隻需記住Android自定義ListView三步驟: 

第一步:準備主布局檔案、元件布局檔案等 

第二步:擷取并整理資料 

第三部:綁定資料,這裡我們是通過自己編寫Adapter類來完成的 

1.首先建立一個list.XML 

<?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:orientation="vertical" >  
    <LinearLayout android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        android:orientation="horizontal" android:background="#f1e4f1">  
        <ImageView   
            android:id="@+id/image"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"/>  
        <TextView   
            android:id="@+id/title"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:textColor="#666872"/>  
        <Button   
            android:id="@+id/view"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:text="詳細"/>  
    </LinearLayout>  
    <TextView   
        android:id="@+id/info"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:textColor="#666872"/>  
</LinearLayout>             

2、建立一個擴充卡類MyAdspter.java 

public class MyAdspter extends BaseAdapter {  
  
    private List<Map<String, Object>> data;  
    private LayoutInflater layoutInflater;  
    private Context context;  
    public MyAdspter(Context context,List<Map<String, Object>> data){  
        this.context=context;  
        this.data=data;  
        this.layoutInflater=LayoutInflater.from(context);  
    }  
    /** 
     * 元件集合,對應list.xml中的控件 
     * @author Administrator 
     */  
    public final class Zujian{  
        public ImageView image;  
        public TextView title;  
        public Button view;  
        public TextView info;  
    }  
    @Override  
    public int getCount() {  
        return data.size();  
    }  
    /** 
     * 獲得某一位置的資料 
     */  
    @Override  
    public Object getItem(int position) {  
        return data.get(position);  
    }  
    /** 
     * 獲得唯一辨別 
     */  
    @Override  
    public long getItemId(int position) {  
        return position;  
    }  
  
    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        Zujian zujian=null;  
        if(convertView==null){  
            zujian=new Zujian();  
            //獲得元件,執行個體化元件  
            convertView=layoutInflater.inflate(R.layout.list, null);  
            zujian.image=(ImageView)convertView.findViewById(R.id.image);  
            zujian.title=(TextView)convertView.findViewById(R.id.title);  
            zujian.view=(Button)convertView.findViewById(R.id.view);  
            zujian.info=(TextView)convertView.findViewById(R.id.info);  
            convertView.setTag(zujian);  
        }else{  
            zujian=(Zujian)convertView.getTag();  
        }  
        //綁定資料  
        zujian.image.setBackgroundResource((Integer)data.get(position).get("image"));  
        zujian.title.setText((String)data.get(position).get("title"));  
        zujian.info.setText((String)data.get(position).get("info"));  
        return convertView;  
    }  
  
}             

關于上面LayoutInflater的使用:在實際開發種LayoutInflater這個類還是非常有用的。它的作用類似 

于 findViewById(),不同點是LayoutInflater是用來找layout下xml布局檔案,并且會執行個體化!。 

getView()的三個參數:position表示将顯示的是第幾行,covertView是從布局檔案中inflate來的布 

局。我們用LayoutInflater的方法将定義好的list.xml檔案提取成View執行個體用來顯示。然後将xml檔案 

中的各個元件執行個體化,這樣便可以将資料對應到各個元件上了。但是按鈕為了響應點選事件,需要為 

它添加點選監聽器,這樣就能捕獲點選事件。 

3、activity_main.xml中添加ListView控件 

<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"  
    android:paddingBottom="@dimen/activity_vertical_margin"  
    android:paddingLeft="@dimen/activity_horizontal_margin"  
    android:paddingRight="@dimen/activity_horizontal_margin"  
    android:paddingTop="@dimen/activity_vertical_margin"  
    tools:context=".MainActivity" >  
    <ListView   
        android:id="@+id/list"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"></ListView>  
</RelativeLayout>             

4、在activity中調用ListView

public class MainActivity extends Activity {  
  
    private ListView listView=null;   
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        listView=(ListView)findViewById(R.id.list);  
        List<Map<String, Object>> list=getData();  
        listView.setAdapter(new MyAdspter(this, list));  
    }  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
  
    public List<Map<String, Object>> getData(){  
        List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();  
        for (int i = 0; i < 10; i++) {  
            Map<String, Object> map=new HashMap<String, Object>();  
            map.put("image", R.drawable.ic_launcher);  
            map.put("title", "這是一個标題"+i);  
            map.put("info", "這是一個詳細資訊"+i);  
            list.add(map);  
        }  
        return list;  
    }  
}             

繼續閱讀