android學習摘記——自訂Adapter的心得

來源:互聯網
上載者:User

在ListView,GridView。。。。中經常用到適配器Adapter,但是anroid 提供的Adapter只是幾種架構,如果我們有需求,還是要自己根據需求而自訂Adapter的

android提供的三種Adapter主要有ArrayAdapter,SimpleAdapter,SimpleCursorAdapter,ArraAdapter是簡單的字串適配器(很醜,因為沒辦法帥。。。),SimpleAdapter是可以自訂子View布局的,可以有圖片(只限於本地圖片,如果要用網路載入圖片,請參考我之前的一篇Blog),SimpleCursorAdapter主要用於資料庫,前兩個的資料來源一般都是String[]或者List,後一個的資料來源一般是資料庫查詢得到的Cursor

而我們自訂用的最多的還是繼承自SimpleAdapter,下面說一下具體用法

我還是連著上一篇Blog,想做一個顯示帶下載進度條的子View顯示於ListView中,SimpleAdapter可以顯示一般的圖片,但是無法顯示進度條(因為不只是要顯示,還要有即時更新),所以我們的做法是繼承SimpleAdapter,具體要複寫的方法有4個:

public int getCount() 
public Object getItem(int position)
public long getItemId(int position)
public View getView(int position, View convertView, ViewGroup parent) 

還有一個更重要的是其構造方法MyAdapter(Context context, List<Map<String, Object>> list)參數不是固定的,可以根據要用到的資料自己定義,第一個參數是要顯示的上下文環境,第二個參數是用來記錄各個條目的資訊

第一個方法主要是返回ListView中要顯示的子View數量,也就是下載任務數,只要返回構造方法中的list的條目就可以了

第二個方法是要返回一個子View,即ListView中的一個子條目,當然你也可以自訂返回你想要的資訊

第三個方法是根據ListView中的位置返回id、

最重要最難理解的也就是第四個方法了,第四個方法主要是返回這個條目的整個資訊,它是一個單獨的布局檔案,當然根據android結構也是一個View類的繼承類了,這裡還有一個知識點是LayoutInflater類,它的inflate()方法可以根據布局檔案獲得其View傳回值,而最重要的思想是你要從這些條目中獲得其子View(關係為ListView中有很多條目,每個條目中又有很多組件,我這裡是ListView中多個下載任務是不同的條目,每個下載任務中的名字,進度又是其子View的組件),再得到其子組件之後,就可以根據構造方法中List<Map<String, Object>> list參數傳遞的值進行對應的賦值或者設定資源了,具體代碼如下:

 1 import java.util.List;
2 import java.util.Map;
3
4 import android.content.Context;
5 import android.view.LayoutInflater;
6 import android.view.View;
7 import android.view.ViewGroup;
8 import android.widget.BaseAdapter;
9 import android.widget.LinearLayout;
10 import android.widget.ProgressBar;
11 import android.widget.TextView;
12
13 public class MyAdapter extends BaseAdapter
14 {
15 private Context context;
16
17 private LayoutInflater layoutInflater;
18
19 private List<Map<String, Object>> list;
20
21 //構造方法,參數list傳遞的就是這一組資料的資訊
22 public MyAdapter(Context context, List<Map<String, Object>> list)
23 {
24 this.context = context;
25
26 layoutInflater = LayoutInflater.from(context);
27
28 this.list = list;
29 }
30
31 //得到總的數量
32 public int getCount()
33 {
34 // TODO Auto-generated method stub
35 return this.list!=null? this.list.size(): 0 ;
36 }
37
38 //根據ListView位置返回View
39 public Object getItem(int position)
40 {
41 // TODO Auto-generated method stub
42 return this.list.get(position);
43 }
44
45 //根據ListView位置得到List中的ID
46 public long getItemId(int position)
47 {
48 // TODO Auto-generated method stub
49 return position;
50 }
51
52 //根據位置得到View對象
53 public View getView(int position, View convertView, ViewGroup parent)
54 {
55 if(convertView == null)
56 {
57 convertView = layoutInflater.inflate(R.layout.item, null);
58 }
59
60 //得到條目中的子組件
61 TextView tv1 = (TextView)convertView.findViewById(R.id.nameTextView);
62 ProgressBar pb = (ProgressBar)convertView.findViewById(R.id.sizeProgressBar);
63 TextView tv2 = (TextView)convertView.findViewById(R.id.sizeTextView);
64
65 //從list對象中為子組件賦值
66 tv1.setText(list.get(position).get("name").toString());
67 pb.setProgress(Integer.parseInt(list.get(position).get("size").toString()));
68 tv2.setText(list.get(position).get("size").toString());
69
70 return convertView;
71 }
72 }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.