生活随笔
收集整理的這篇文章主要介紹了
Android之自定义Adapter的ListView
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發中,我們經常使用到ListView這個控件。
Android
的API也提供了許多創建ListView適配器的快捷方式。例如
ArrayAdapter、SimpleAdapter和SimpleCursorAdapter
等。但你是否發現,如果采用這些系統自帶的適配器,對于事件的響應只能局限在一個行單位。假設一行里面有一個按鈕和一個圖片控件,它們之間的響應操作是不一樣的。若采用系統自帶的適配器,就
不能精確到每個控件的響應事件
。這時,我們一般采取自定義適配器來實現這個比較精確地請求。
?????? ListView的創建,一般要具備兩大元素:
???????1)數據集,即要映射的字符串、圖片信息之類。
???????2)適配器,實現把要映射的字符串、圖片信息映射成視圖(如Textview、Image等組件),再添加到ListView中。
?????? 下面是一個實操例子:
???????實現細節:
???????1、創建數據集,一般定義如下
????????private List<Map<String, Object>> listItems;
????????元素添加方式:
????????Map<String, Object> map = new HashMap<String, Object>();?
??? ?? ?map.put("image", imgeIDs[i]);??????? ? //圖片資源
??? ?? ?map.put("title", "物品名稱:");?????????? //物品標題
??? ?? ?map.put("info", goodsNames[i]);????? //物品名稱
??? ?? ?map.put("detail", goodsDetails[i]); ? //物品詳情
??????? listItems.add(map);???????????????????????? //添加一項
????????2、創建適配器
????????public class ListViewAdapter extends BaseAdapter{........}? //自定義的適配器一般繼承BaseAdapter類
??????? listViewAdapter = new ListViewAdapter(this, listItems);
????????3、給ListView設置適配器
????????listView.setAdapter(listViewAdapter);
????????4、這里還有個關鍵點,如何把list_item.xml布局作為一個視圖,添加到listView中:
??????? LayoutInflater listContainer;???//視圖容器工廠
??????? listContainer = LayoutInflater.from(context);?//創建視圖容器工廠并設置上下文
??????? convertView = listContainer.inflate(R.layout.list_item, null);?? //創建list_item.xml布局文件的視圖
???????
????????實例視圖如下:
1)布局文件main.xml
???????
<?xml?version="1.0"?encoding="utf-8"?>?? ?<LinearLayout?xmlns:Android="http://schemas.android.com/apk/res/android"?? ????Android:orientation="vertical"?? ????Android:layout_width="fill_parent"?? ????Android:layout_height="fill_parent">?? ???? ?? ?????? ????<LinearLayout?Android:gravity="center_horizontal"?? ????Android:orientation="horizontal"?android:layout_width="fill_parent"?? ????Android:layout_height="wrap_content">?? ????<TextView?Android:text="結算:?"?? ????????Android:layout_width="wrap_content"?? ????????Android:layout_height="wrap_content"? ?? ????????Android:textColor="#FFFFFFFF"? ?? ????????Android:textSize="20px"/>?? ????<ImageButton?Android:id="@+id/imgbt_sum"? ?? ????????Android:layout_width="40px"?? ????????Android:layout_height="40px"?? ????????Android:background?=?"@drawable/shopping"?/>?? ????</LinearLayout>?? ???? ?? ????<TextView?Android:text="商品列表:?"?? ????????Android:layout_width="wrap_content"?? ????????Android:layout_height="wrap_content"? ?? ????????Android:textColor="#FFFFFFFF"?/>?? ???????? ?? ????? ?? ????<ListView?Android:id="@+id/list_goods"? ?? ????????Android:layout_width="fill_parent"?? ????????Android:layout_height="wrap_content"?/>?? ???????? ?? ?</LinearLayout>??
???????列表項布局文件list_item.xml??????
<?xml?version="1.0"?encoding="utf-8"?>?? ?<LinearLayout?xmlns:Android="http://schemas.android.com/apk/res/android"?? ????Android:orientation="horizontal"?android:layout_width="fill_parent"?? ????Android:layout_height="fill_parent">?? ?? ?????? ????<ImageView?Android:id="@+id/imageItem"? ?? ????????Android:layout_width="wrap_content"?? ????????Android:layout_height="wrap_content"? ?? ????????Android:layout_margin="5px"/>?? ???? ?? ?????? ????<LinearLayout?Android:orientation="vertical"?? ????????Android:layout_width="wrap_content"? ?? ????????Android:layout_height="wrap_content">?? ?? ????????<TextView?Android:id="@+id/titleItem"? ?? ????????????Android:layout_width="wrap_content"?? ????????????Android:layout_height="wrap_content"? ?? ????????????Android:textColor="#FFFFFFFF"?? ????????????Android:textSize="13px"?/>?? ????????<TextView?Android:id="@+id/infoItem"? ?? ????????????Android:layout_width="wrap_content"?? ????????????Android:layout_height="wrap_content"? ?? ????????????Android:textColor="#FFFFFFFF"?? ????????????Android:textSize="22px"?/>?? ????</LinearLayout>?? ???? ?? ?????? ????<LinearLayout?Android:gravity="right"?? ????Android:orientation="horizontal"?android:layout_width="fill_parent"?? ????Android:layout_height="wrap_content">?? ????<CheckBox?Android:id="@+id/checkItem"? ?? ????????Android:layout_width="wrap_content"?? ????????Android:layout_height="wrap_content"? ?? ????????Android:layout_margin="5px"/>?? ????<Button??Android:id="@+id/detailItem"? ?? ????????Android:layout_width="wrap_content"?? ????????Android:layout_height="wrap_content"? ?? ????????Android:layout_margin="5px"/>?? ????</LinearLayout>?? ?</LinearLayout>??
????????2)代碼,主代碼:????????
package?com.myAndroid.test; ?? ?? ?import?java.util.ArrayList; ?? ?import?java.util.HashMap; ?? import?java.util.List; ?? import?java.util.Map; ?? ?? import?Android.app.Activity; ?? import?Android.app.AlertDialog; ?? import?Android.content.DialogInterface; ?? import?Android.os.Bundle; ?? import?Android.view.View; ?? import?Android.view.View.OnClickListener; ?? import?Android.widget.ArrayAdapter; ?? import?Android.widget.ImageButton; ?? import?Android.widget.ListView; ?? ?? public?class?MyListView?extends?Activity?{ ?? ???? ?? ????private?ListView?listView; ?? ????private?ImageButton?imgbt_sum; ?? ????private?ListViewAdapter?listViewAdapter; ?? ????private?List<Map<String,?Object>>?listItems; ?? ????private?Integer[]?imgeIDs?=?{R.drawable.cake,? ?? ????????????R.drawable.gift,?R.drawable.letter, ?? ????????????R.drawable.love,?R.drawable.mouse, ?? ????????????R.drawable.music}; ?? ????private?String[]?goodsNames?=?{"蛋糕",?"禮物",? ?? ????????????"郵票",?"愛心",?"鼠標",?"音樂CD"}; ?? ????private?String[]?goodsDetails?=?{ ?? ????????????"蛋糕:好好吃。",? ?? ????????????"禮物:禮輕情重。",? ?? ????????????"郵票:環游世界。",? ?? ????????????"愛心:世界都有愛。", ?? ????????????"鼠標:反應敏捷。", ?? ????????????"音樂CD:酷我音樂。"}; ?? ???? ?? ?????? ????@Override?? ????public?void?onCreate(Bundle?savedInstanceState)?{ ?? ????????super.onCreate(savedInstanceState); ?? ????????setContentView(R.layout.main); ?? ???????? ?? ????????listView?=?(ListView)findViewById(R.id.list_goods);? ?? ????????imgbt_sum?=?(ImageButton)?findViewById(R.id.imgbt_sum); ?? ????????imgbt_sum.setOnClickListener(new?ClickEvent()); ?? ????????listItems?=?getListItems(); ?? ????????listViewAdapter?=?new?ListViewAdapter(this,?listItems);??? ????????listView.setAdapter(listViewAdapter); ?? ????} ?? ???? ?? ????? ? ?? ????private?List<Map<String,?Object>>?getListItems()?{ ?? ????????List<Map<String,?Object>>?listItems?=?new?ArrayList<Map<String,?Object>>(); ?? ????????for(int?i?=?0;?i?<?goodsNames.length;?i++)?{ ?? ????????????Map<String,?Object>?map?=?new?HashMap<String,?Object>();? ?? ????????????map.put("image",?imgeIDs[i]);????????????????? ????????????map.put("title",?"物品名稱:");???????????????? ????????????map.put("info",?goodsNames[i]);??????? ????????????map.put("detail",?goodsDetails[i]);??? ????????????listItems.add(map); ?? ????????}??? ?? ????????return?listItems; ?? ????} ?? ???? ?? ????class?ClickEvent?implements?OnClickListener{ ?? ?? ????????@Override?? ????????public?void?onClick(View?v)?{ ?? ?????????????? ????????????String?goodsList?=?""; ?? ????????????for(int?i?=?0;?i?<?listItems.size();?i++)?{ ?? ????????????????goodsList?+=?listViewAdapter.hasChecked(i)??goodsNames[i]?+?"??":?""; ?? ????????????} ?? ????????????new?AlertDialog.Builder(MyListView.this) ?? ????????????.setTitle("購物清單:") ?? ????????????.setMessage("你好,你選擇了如下商品:\n"?+?goodsList) ?? ????????????.setPositiveButton("確定",?null) ?? ????????????.show(); ?? ????????} ?? ???????? ?? ????} ?? } ??
?
?
適配器代碼:
??????
package?com.myAndroid.test; ?? ?? ?import?java.util.List; ?? import?java.util.Map; ?? ?? import?Android.app.AlertDialog; ?? import?Android.content.Context; ?? import?Android.util.Log; ?? import?Android.view.LayoutInflater; ?? import?Android.view.View; ?? import?Android.view.ViewGroup; ?? import?Android.widget.BaseAdapter; ?? import?Android.widget.Button; ?? import?Android.widget.CheckBox; ?? import?Android.widget.CompoundButton; ?? import?Android.widget.ImageView; ?? import?Android.widget.ListView; ?? import?Android.widget.TextView; ?? ?? public?class?ListViewAdapter?extends?BaseAdapter?{ ?? ????private?Context?context;?????????????????????????? ????private?List<Map<String,?Object>>?listItems;?????? ????private?LayoutInflater?listContainer;????????????? ????private?boolean[]?hasChecked;????????????????????? ????public?final?class?ListItemView{?????????????????? ????????????public?ImageView?image;?? ?? ????????????public?TextView?title;?? ?? ????????????public?TextView?info; ?? ????????????public?CheckBox?check; ?? ????????????public?Button?detail;??????? ?? ?????}?? ?? ???? ?? ???? ?? ????public?ListViewAdapter(Context?context,?List<Map<String,?Object>>?listItems)?{ ?? ????????this.context?=?context;????????? ?? ????????listContainer?=?LayoutInflater.from(context);????? ????????this.listItems?=?listItems; ?? ????????hasChecked?=?new?boolean[getCount()]; ?? ????} ?? ?? ????public?int?getCount()?{ ?? ?????????? ????????return?listItems.size(); ?? ????} ?? ?? ????public?Object?getItem(int?arg0)?{ ?? ?????????? ????????return?null; ?? ????} ?? ?? ????public?long?getItemId(int?arg0)?{ ?? ?????????? ????????return?0; ?? ????} ?? ???? ?? ????? ? ? ?? ????private?void?checkedChange(int?checkedID)?{ ?? ????????hasChecked[checkedID]?=?!hasChecked[checkedID]; ?? ????} ?? ???? ?? ????? ? ? ? ?? ????public?boolean?hasChecked(int?checkedID)?{ ?? ????????return?hasChecked[checkedID]; ?? ????} ?? ???? ?? ????? ? ? ?? ????private?void?showDetailInfo(int?clickID)?{ ?? ????????new?AlertDialog.Builder(context) ?? ????????.setTitle("物品詳情:"?+?listItems.get(clickID).get("info")) ?? ????????.setMessage(listItems.get(clickID).get("detail").toString())?????????????? ?? ????????.setPositiveButton("確定",?null) ?? ????????.show(); ?? ????} ?? ???? ?? ??????? ?? ????? ? ?? ????public?View?getView(int?position,?View?convertView,?ViewGroup?parent)?{ ?? ?????????? ????????Log.e("method",?"getView"); ?? ????????final?int?selectID?=?position; ?? ?????????? ????????ListItemView??listItemView?=?null; ?? ????????if?(convertView?==?null)?{ ?? ????????????listItemView?=?new?ListItemView();? ?? ?????????????? ????????????convertView?=?listContainer.inflate(R.layout.list_item,?null); ?? ?????????????? ????????????listItemView.image?=?(ImageView)convertView.findViewById(R.id.imageItem); ?? ????????????listItemView.title?=?(TextView)convertView.findViewById(R.id.titleItem); ?? ????????????listItemView.info?=?(TextView)convertView.findViewById(R.id.infoItem); ?? ????????????listItemView.detail=?(Button)convertView.findViewById(R.id.detailItem); ?? ????????????listItemView.check?=?(CheckBox)convertView.findViewById(R.id.checkItem); ?? ?????????????? ????????????convertView.setTag(listItemView); ?? ????????}else?{ ?? ????????????listItemView?=?(ListItemView)convertView.getTag(); ?? ????????} ?? ?? ?? ???????? ?? ?????????? ????????listItemView.image.setBackgroundResource((Integer)?listItems.get( ?? ????????????????position).get("image")); ?? ????????listItemView.title.setText((String)?listItems.get(position) ?? ????????????????.get("title")); ?? ????????listItemView.info.setText((String)?listItems.get(position).get("info")); ?? ????????listItemView.detail.setText("商品詳情"); ?? ?????????? ????????listItemView.detail.setOnClickListener(new?View.OnClickListener()?{ ?? ????????????@Override?? ????????????public?void?onClick(View?v)?{ ?? ?????????????????? ????????????????showDetailInfo(selectID); ?? ????????????} ?? ????????}); ?? ?????????? ????????listItemView.check ?? ????????????????.setOnCheckedChangeListener(new?CheckBox.OnCheckedChangeListener()?{ ?? ????????????????????@Override?? ????????????????????public?void?onCheckedChanged(CompoundButton?buttonView, ?? ????????????????????????????boolean?isChecked)?{ ?? ?????????????????????????? ????????????????????????checkedChange(selectID); ?? ????????????????????} ?? ????????}); ?? ???????? ?? ????????return?convertView; ?? ????} ?? }??
????????至于,如何實現系統自帶的適配器,如ArrayAdapter、SimpleAdapter和SimpleCursorAdapter等,有機會再補充。
總結
以上是生活随笔為你收集整理的Android之自定义Adapter的ListView的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。