1. 程式人生 > >Android中最常用的控制元件之ListView

Android中最常用的控制元件之ListView

一、前言:作為一個新手的我,也剛開始學List View遇到了很多問題,最主要的是有很多不懂的地方,尤其是在給List View中的自定義一些圖片或者其他的控制元件的時候,就需要自定義一個類和介面卡,可能是我對介面卡和泛型的理解不到位吧,希望在以後的學習中能將對這兩方面的知識空缺填補回來。另外圖中有自定義的標題欄,但實際程式碼中是被我刪除了的。

二、分析:首先做一個簡短的分析,前面也說了我對這個控制元件的理解不是很到位,只能站在我理解的高度進行一點簡短的分析。相對於其他簡單控制元件來說,List View是一個比較特殊的控制元件,最基本的只在Item中新增一個標題的簡單用法這裡就不說了,主要說一下如何自定義在List View中新增標題以及說明還有圖片等其他控制元件的用法,如下圖所示:


要想弄成圖中這種:

三、實現過程

1. 我首先寫了一個China類,他的屬性包括Item裡的圖片和標題(裡面的地名)還有標題說明(地名下面的一段話)程式碼如下:

public class China {
    private String name;
    private String capital;
    private int image;
    public China(String name,String capital,int image){
        this.name = name;
        this.capital = capital;
        this.image = image;
    }
    public String getName(){
        return name;
    }
    public String getCapital(){
        return capital;
    }
    public int getIcon(){
        return image;
    }
}

2. 然後再寫一個List View裡面每一行(Item)的佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    >
    <ImageView
        android:id="@+id/ItemImage"
        android:layout_alignParentLeft="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        />
    <TextView
        android:id="@+id/ItemTitle"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:textSize="20sp"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/ItemImage"
        />
    <TextView
        android:id="@+id/ItemText"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_below="@+id/ItemTitle"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/ItemImage"
        />
</RelativeLayout>

3、自定義一個介面卡,將資料來源傳遞到item中去:

public class ChinaAdapter extends ArrayAdapter<China>{
    private int resourceId;
    public ChinaAdapter(Context context, int textViewResourceId, List<China> objects){
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;
    }
    @Override
    public View  getView(int position, View convertView, ViewGroup parent) {
        China china = getItem (position);
        View view;
        if(convertView==null){
            view = LayoutInflater.from ( getContext () ).inflate ( resourceId,parent,false );
        }else {
            view = convertView;
        }
        ImageView  chinaImage = view.findViewById ( R.id.ItemImage);
        TextView chinaTitle = view.findViewById ( R.id.ItemTitle );
        TextView chinaText = view.findViewById ( R.id.ItemText );
        chinaTitle.setText ( china.getName () );
        chinaText.setText ( china.getCapital () );
        chinaImage.setImageResource ( china.getIcon () );
        return  view;
    }
}

4.最後就是MainActivity:

public class MainActivity extends AppCompatActivity {

    private ListView mLv;
    private List<China>chinaList = new ArrayList<> (  );
    private String[]  data = { "北京","重慶","甘肅","上海", "浙江","江蘇"};
    private String[]  dataText = {"北京:祖國的首都","重慶:從你的全世界路過","蘭州:我想吃拉麵",
            "上海:等我,我一定會去看看","杭州:可能會路過的","南京:不瞭解"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate ( savedInstanceState );
        setContentView ( R.layout.activity_main );
        //初始化China屬性
        initChina ();
        ChinaAdapter adapter = new ChinaAdapter ( MainActivity.this,R.layout.item,chinaList );
        mLv = findViewById ( R.id.mLv );
        //將資料載入到ListView中
        mLv.setAdapter ( adapter );
        //下面是對ListView的點選事件
        mLv.setOnItemClickListener ( new AdapterView.OnItemClickListener () {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                China china = chinaList.get ( i );//i是判斷是點了那個Item
                Toast.makeText ( MainActivity.this,china.getCapital (),Toast.LENGTH_SHORT ).show ();
            }
        } );
    }
    private  void  initChina(){
        for (int i = 0;i<2;i++) {
            China beijing = new China ( data[0], dataText[0], R.mipmap.bj );
            chinaList.add ( beijing );
            China chongqing = new China ( data[1], dataText[1], R.mipmap.cq );
            chinaList.add ( chongqing );
            China gansu = new China ( data[2], dataText[2], R.mipmap.gs );
            chinaList.add ( gansu );
            China shanghai = new China ( data[3], dataText[3], R.mipmap.sh );
            chinaList.add ( shanghai );
            China zhejiang = new China ( data[4], dataText[4], R.mipmap.zj );
            chinaList.add ( zhejiang );
            China jiangsu = new China ( data[5], dataText[5], R.mipmap.js );
            chinaList.add ( jiangsu );
        }
    }
}

後記:最簡單的一次筆記,確實也沒理解到位。等後面再繼續完善吧。

原始碼下載