天天看點

Android ListView的使用ListView的應用

注:本文為閱讀郭霖先生的《第一行代碼 Android》之後個人臆想,叙述不足之處可前往郭霖大牛的部落格學習,此處僅為個人友善長久學習、記憶。

ListView的應用

ListView的使用主要分為分為以下幾步

一、确定ListView的子項布局内容

二、為ListView構造擴充卡

三、實作ListView

接下來是各步驟的個人見解。

一、确定ListView中的子項布局内容

java中的List清單裡面的每一個子項可以是一個對象,而一個對象可以包含多個屬性;類比可知ListView中的每個子項布局内容其實就相當于List中的一個對象,确定其内容相當于确定一個對象應當具備那些屬性,隻不過這些布局屬性是Button、TextView之類的控件,通過控件來展示你想要表達的資訊。

在這一步中,你需要設計一個類來對應一個子項布局,類的每一個屬性對應子項布局中的每一個控件,用屬性存放控件中要展示的資訊。第三步實作ListView時擷取一個該類的對象清單,傳入擴充卡,再進一步将對象中的資料加載到ListView内。

二、為ListView構造擴充卡

java中最原生的擴充卡類為ArrayAdaper<T>,如果我們的子項布局内容超過一項,我們同就得自己重新設計一個擴充卡,原生的擴充卡隻能為子項隻包含一個控件屬性的ListView适配内容。

而構造擴充卡也是ListView成為難用控件的最主要原因(個人認為)。

我從郭霖大牛的書中學來的構造擴充卡的過程如下,

  1. 自定義一個構造器繼承自ArrayAdaper<T>(此處的T位第一步中你構造的類)
  2. 設定一個int屬性,用于記錄傳入的子項布局檔案的id,這裡記為sub_id
  3. 編寫構造函數,參數有三個,類型分别為Context、int、List<T>(此處T與1中同,以下T皆同),其中Context為程式執行上下文對象,int 為子項布局檔案的id,List為第一大步驟中所述的對象清單。構造函數比較簡單,隻包含兩行,第一行是調用super即父類ArrayAdaper中的構造函數,将目前構造函數傳入的參數在super中重傳一遍即可;第二行代碼就是将傳入的int值賦給第2步中設定的屬性,構造函數就這樣完成了
  4. 重寫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;
    }      
第二步:構造擴充卡
public 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;
    }
}      
第三步:實作ListView
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/)處搜尋更好的解答吧,或者相信我的話可以評論區留言,我會盡力為你解答的。