注:本文為閱讀郭霖先生的《第一行代碼 Android》之後個人臆想,叙述不足之處可前往郭霖大牛的部落格學習,此處僅為個人友善長久學習、記憶。
ListView的應用
ListView的使用主要分為分為以下幾步
一、确定ListView的子項布局内容
二、為ListView構造擴充卡
三、實作ListView
接下來是各步驟的個人見解。
一、确定ListView中的子項布局内容
java中的List清單裡面的每一個子項可以是一個對象,而一個對象可以包含多個屬性;類比可知ListView中的每個子項布局内容其實就相當于List中的一個對象,确定其内容相當于确定一個對象應當具備那些屬性,隻不過這些布局屬性是Button、TextView之類的控件,通過控件來展示你想要表達的資訊。
在這一步中,你需要設計一個類來對應一個子項布局,類的每一個屬性對應子項布局中的每一個控件,用屬性存放控件中要展示的資訊。第三步實作ListView時擷取一個該類的對象清單,傳入擴充卡,再進一步将對象中的資料加載到ListView内。
二、為ListView構造擴充卡
java中最原生的擴充卡類為ArrayAdaper<T>,如果我們的子項布局内容超過一項,我們同就得自己重新設計一個擴充卡,原生的擴充卡隻能為子項隻包含一個控件屬性的ListView适配内容。
而構造擴充卡也是ListView成為難用控件的最主要原因(個人認為)。
我從郭霖大牛的書中學來的構造擴充卡的過程如下,
- 自定義一個構造器繼承自ArrayAdaper<T>(此處的T位第一步中你構造的類)
- 設定一個int屬性,用于記錄傳入的子項布局檔案的id,這裡記為sub_id
- 編寫構造函數,參數有三個,類型分别為Context、int、List<T>(此處T與1中同,以下T皆同),其中Context為程式執行上下文對象,int 為子項布局檔案的id,List為第一大步驟中所述的對象清單。構造函數比較簡單,隻包含兩行,第一行是調用super即父類ArrayAdaper中的構造函數,将目前構造函數傳入的參數在super中重傳一遍即可;第二行代碼就是将傳入的int值賦給第2步中設定的屬性,構造函數就這樣完成了
- 重寫getView方法,這是初學者使用ListView整個過程中我認為最困難的部分。getView方法傳回一個View對象,即一個子項布局。參數同樣有三個,類型分别為int position、View convertView、ViewGroup parent,作用如下:int值(position)作為函數getItem方法的實參擷取一個T型執行個體,這個T型執行個體将作為資料的承載體将資料填入每一個子項布局,然後加載到ListView中;另外兩個參數隻是個人的一些猜測,這裡就不詳述。在方法體内擷取一個T型執行個體後,接下來就是将執行個體内容加載到子項布局中。這裡構造一個View型對象view,通過LayoutInflate.from(getConext()).inflate(sub_id,parent,false)方法執行個體化;接下來的資料加載過程比較簡單,隻在代碼中展示。
三、實作ListView
這一步邏輯相對比較簡單,首先構造T型對象清單,然後new一個擴充卡對象并執行個體化,最後通過ListView對象的setAdapter方法将擴充卡作為實參傳入即可實作ListView的應用。接下來是ListView的實戰使用:
第一步,确定子項布局内容然後是設定對應的類:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/contacter_image" android:layout_width="match_parent" android:layout_height="wrap_content" android:scaleType="centerInside"/> <TextView android:id="@+id/contact_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAlignment="center" android:textColor="@color/colorPrimaryDark" android:textSize="15dp"/> </LinearLayout>
第二步:構造擴充卡public class Contacter { protected String name; protected int image_id; public Contacter(String name, int image_id) { this.name = name; this.image_id = image_id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getImage_id() { return image_id; } public void setImage_id(int image_id) { this.image_id = image_id; }
第三步:實作ListViewpublic class SecondListViewAdapter extends ArrayAdapter<Contacter> { //記錄傳入的子項布局的id private int sub_listview_id; //自定義的擴充卡的構造函數 public SecondListViewAdapter(Context context, int listview_item_id, List<Contacter> contacterList){ super(context,listview_item_id,contacterList); sub_listview_id=listview_item_id; } /*重寫getView方法,該方法當每個子項被滾動到螢幕内時調用,該方法内通過getItem方法得到目前的 * Contacter執行個體,然後使用LayoutInflater來為這個子項加在傳入的布局。 */ @Override public View getView(int position, View convertView, ViewGroup parent){ //擷取T型執行個體 Contacter contacter=getItem(position); View view= LayoutInflater.from(getContext()).inflate(sub_listview_id,parent,false); //實體化申請的子項控件,以便加載資料 ImageView con_ima=(ImageView)view.findViewById(R.id.contacter_image); TextView con_name=(TextView)view.findViewById(R.id.contact_name); //加載資料 con_ima.setImageResource(contacter.getImage_id()); con_name.setText(contacter.getName()); return view; } }
public class SecondActivity extends AppCompatActivity { private List<Contacter> contacterList=new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.secondlayout); Contacter c; try { /*以下是通過java反射擷取本地圖檔并封裝将圖檔名和圖檔id封裝為Contacter對象最後添加到 *contacterList中 */ R.drawable d = new R.drawable(); for (int i = 1; i <= 10; i++) { String ima_name="christmas_lable_0" + i; Field fieldimgId = d.getClass().getDeclaredField(ima_name); int imgId = (Integer) fieldimgId.get(d);//這個ID就是每個圖檔資源ID c=new Contacter(ima_name,imgId); //TODO contacterList.add(c); } } catch (Exception e) { e.printStackTrace(); } //建立擴充卡對象 SecondListViewAdapter adapter=new SecondListViewAdapter(SecondActivity.this,R.layout.sub_listview,contacterList); ListView listView=(ListView)findViewById(R.id.listview_contacts); //為設定擴充卡listView對象,完成ListView和資料之間的關聯 listView.setAdapter(adapter); } }
接下來運作程式應該就可以看到一個清單,裡面有圖檔還有圖檔的名字。
好了,ListView的使用到此結束,希望我的表述你能看明白。 第一次寫這玩意,手都凍僵了,也算給自己留點記憶,希望以後自己再也不用翻書了。覺得不明白的朋友可以前往郭霖大佬(http://blog.csdn.net/sinyu890807/)處搜尋更好的解答吧,或者相信我的話可以評論區留言,我會盡力為你解答的。