1. 程式人生 > >Android開發筆記(12)——ListView & Adapter

Android開發筆記(12)——ListView & Adapter

dba 只顯示一行 -1 ngs 而已 整理 adapt array xxx

轉載請註明:http://www.cnblogs.com/igoslly/p/6947225.html

下一章是關於ListFragment的內容,首先先介紹ListView的相關配置,理解ListFragment也相較容易。

在fznpcy專欄:http://blog.csdn.net/fznpcy/article/details/8658155/ 有較為詳盡的講解和範例。

ListView & Adapter

一、Adapter

Adapter是連接後端數據和前端顯示的適配器接口,是數據和UI(View)之間一個重要的紐帶。

在常見的View(List View,Grid View)等地方都需要用到Adapter

如下圖直觀的表達了DataAdapterView三者的關系:

技術分享

Adapter存在多種形式,但我們這裏只介紹常用的ArrayAdapterSimpleAdapterBaseAdapter

技術分享

二、ArrayAdapter

每個Adapter都要自定義各自的item布局文件,ArrayAdapter只包含文字,一般使用android.R.layout.simple_list_item_1系統定義好的布局文件只顯示一行文字

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id
="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:paddingLeft="16dp" android:paddingRight="16dp" android:textColor="#fff"
android:background="?android:attr/activatedBackgroundIndicator" android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

創建ArrayAdapter

String[] strs = {"1","2","3","4","5"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.xxx,strs);

當然也可以在Android Studiostrings.xml中直接定義ArrayList

    <string-array name="list_item">
        <item>Practice Record</item>
        <item>Competition Record</item>
        <item>Previous History</item>
        <item>Game Rules</item>
        <item>How to use this app?</item>
        <item>User Information</item>
    </string-array>

AppDrawer Layout中既可以簡單使用,設定菜單列表。

技術分享

三、SimpleAdapter

SimpleAdapterArrayAdapter能實現更復雜的結構,可放ImageView(圖片),Button(按鈕),CheckBox(復選框)等等。

包含ListView可直接繼承ListActivity,和普通的Activity沒有太大的差別,不同就是對顯示ListView做了許多優化,方面顯示而已。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="8"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="20sp"
            android:padding="2dp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_player"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="Null"
            android:textSize="16sp"
            android:padding="2dp"
            android:id="@+id/list_competition_date"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreA"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="—"
            android:gravity="center"
            android:textSize="28sp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="100"
            android:gravity="center"
            android:textSize="24sp"
            android:textColor="@color/black"
            android:id="@+id/list_competition_scoreB"/>
    </LinearLayout>
</LinearLayout>

接收參數包含

this,布局文件(alist.XML),Hash Map,布局文件控件Id。Hash Map的每個鍵值數據,和布局文件中對應id的組件,一一映射。

創建列表ArrayList,每個元素即是單獨的Hash Map,根據key word關鍵字添加字符串 / 圖片名

map.put("key_word1","value1");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("title", "G1");
            map.put("info", "google 1");
            map.put("img", R.drawable.i1);
            list.add(map);

創建SimpleAdapter

SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
                    new String[]{"title","info","img"},
                    new int[]{R.id.title,R.id.info,R.id.img});

實際效果圖

技術分享

包含圖片的效果圖

技術分享

四、BaseAdapter

在列表上添加Button,實時修改Adapter,都必須使用BaseAdapter

SimpleAdapter也繼承於BaseAdapter

BaseAdapter是抽象類,必須自定義一個Adapter繼承它,也可結合ViewHolder進行顯示。

/* 當List有大量的數據需要加載的時候,會占據大量內存,影響性能,這時候就需要按需填充並重新使用view來減少對象的創建

* 最快的方式是定義一個Viewholder,將convextag設置為Viewholder,不為空時重新使用即可

* findViewById是在解析layout.xml布局那種其中的子View,解析xml是一個力氣活,所以提出了ViewHolder的概念

* 使用一個靜態類,保存xml中的各個子View的引用關系,這樣就不必要每次都去解析xml了。

*/

繼承BaseAdapter定義時,必須重載4個函數:getCount()getItem(int position)getItemId(int position)getView(int position, View convertView, ViewGroup parent)

    public class CompetitionListAdapter extends BaseAdapter {
        private LayoutInflater mInflater=null;
        public CompetitionListAdapter(Context context){
            this.mInflater=LayoutInflater.from(context);
        }
        @Override
        public int getCount(){
            return  competitionlist.size();
        }
        @Override
        public Object getItem(int position){
            return competitionlist.get(position);
        }
        @Override
        public long getItemId(int position){
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            ViewHolder holder = null;
            if (convertView ==null){
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.history_list_competition,null);
                holder.date=(TextView)convertView.findViewById(R.id.list_competition_date);
                holder.scoreA=(TextView)convertView.findViewById(R.id.list_competition_scoreA);
                holder.scoreB=(TextView) convertView.findViewById(R.id.list_competition_scoreB);
                holder.player=(TextView)convertView.findViewById(R.id.list_competition_player);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.date.setText((String)competitionlist.get(position).get("date"));
            holder.scoreA.setText((String)competitionlist.get(position).get("scoreA"));
           holder.scoreB.setText((String)competitionlist.get(position).get("scoreB"));
            holder.player.setText((String)competitionlist.get(position).get("player"));
            return convertView;
        }
        private class ViewHolder{
            public TextView date;
            public TextView player;
            public TextView scoreB;
            public TextView scoreA;
        }
    }

當數據源有修改時,需要notifyDataSetChanged()告知。

        public void setDataList(List<Map<String,Object>> list){
            if (list!=null){
                competitionlist=list;
                notifyDataSetChanged();
            }
        }


本筆記內容均為個人學習整理,轉載請註明博客園-igoslly

Android開發筆記(12)——ListView & Adapter