Android學習筆記:ListView及BaseAdapter使用

來源:互聯網
上載者:User

標籤:android

ListView是Android中常用的重要組件之一,基本上所有軟體基本都會使用ListView,所以要對ListView非常熟悉。

先看看程式:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6D/0A/wKiom1VaoBTSUb_VAAB1s7ztDQ8507.jpg" title="QQ圖片20150519095047.png" alt="wKiom1VaoBTSUb_VAAB1s7ztDQ8507.jpg" />

ListView的樣式很多,有純文字型,帶圖片顯示,帶按鈕的等等。本次示範一個帶圖片的ListView。

①布局檔案:

在ListView程式中,布局檔案相比其他普通控制項會多出至少一個,其原因是還需要一個關於ListView裡面內容條目的布局檔案。

內容條目的布局檔案 listview_item.xml :

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="?android:attr/listPreferredItemHeight">        <ImageView         android:id="@+id/id_imageview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/ic_launcher"        android:layout_alignParentLeft="true"        android:layout_alignParentTop="true"/>    <TextView         android:id="@+id/id_tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@id/id_imageview"        android:layout_marginLeft="15dp"        android:layout_alignParentTop="true"        android:textSize="22sp"        android:textStyle="bold"        android:text="title"/>        <TextView         android:id="@+id/id_tv_desc"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_toRightOf="@id/id_imageview"        android:layout_below="@id/id_tv_title"        android:layout_marginLeft="15dp"        android:textSize="18sp"        android:text="long long ago story"/>    </RelativeLayout>

看了代碼應該就明白了我上面說的ListView內容條目的布局指的就是

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6D/0A/wKiom1VapkfxLmTcAAAngv935pg299.jpg" title="QQ圖片20150519105434.png" alt="wKiom1VapkfxLmTcAAAngv935pg299.jpg" />這樣一條條的布局檔案


另外一個布局檔案,整個android程式的總體布局檔案 activity_main.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.example.testlistview.MainActivity" >        <LinearLayout         android:id="@+id/listview_ll"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="vertical">                <ListView             android:id="@id/android:list"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:drawSelectorOnTop="true"            android:scrollbars="vertical"/>            </LinearLayout></LinearLayout>

只有一個<ListView /> 其中scrollbars="vertical"意思是如果條目很多,滾動時會捲軸是垂直的。


②Android代碼


MainActivity.java

package com.example.testlistview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ListActivity;import android.content.Context;import android.os.Bundle;import android.widget.SimpleAdapter;/** * 注意繼承的是ListActivity * @author jam * */public class MainActivity extends ListActivity {private List<Map<String, Object>> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);list = new ArrayList<Map<String, Object>>();Map<String, Object> map1 = new HashMap<String, Object>();Map<String, Object> map2 = new HashMap<String, Object>();Map<String, Object> map3 = new HashMap<String, Object>();//三項,分別是圖片,大標題,內容map1.put("avatar", R.drawable.add_option);map1.put("user_name", "zhangsan");map1.put("user_ip", "192.168.1.0");map2.put("avatar", R.drawable.add_pic);map2.put("user_name", "lisi");map2.put("user_ip", "192.168.1.1");map3.put("avatar", R.drawable.ic_launcher);map3.put("user_name", "wangwu");map3.put("user_ip", "192.168.1.2");list.add(map1);list.add(map2);list.add(map3);//使用SimpleAdapter的方法/** * 四個參數 * 第一個參數是當前的Context * 第二個參數,是資料來源list * 第三個第四個相當於索引值對的關係 *//*setListAdapter(new SimpleAdapter(getApplicationContext(), list,R.layout.listview_item, new String[] {"user_name", "user_ip"},new int[] {R.id.id_tv_title, R.id.id_tv_desc}));*///設定AdaptersetListAdapter(new MyBaseAdapter(getApplicationContext(), list));}}


其中MyBaseAdapter.java代碼:

package com.example.testlistview;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;/** * 繼承BaseAdapter * 相對於SimpleAdapter來說顯得麻煩,但帶來了更多好處 * @author jam * */public class MyBaseAdapter extends BaseAdapter {private LayoutInflater myInfalater; private List<Map<String, Object>> list;public MyBaseAdapter(Context context, List<Map<String, Object>> list) {super();this.list = list;myInfalater = LayoutInflater.from(context);}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int positionId) {return positionId;}//重要的重寫方法@Overridepublic View getView(int position, View convertView, ViewGroup viewGroup) {ViewHolder viewHolder;if(convertView == null) {convertView = myInfalater.inflate(R.layout.listview_item, null);viewHolder = new ViewHolder();viewHolder.avatar = (ImageView) convertView.findViewById(R.id.id_imageview);viewHolder.title = (TextView) convertView.findViewById(R.id.id_tv_title);viewHolder.desc = (TextView) convertView.findViewById(R.id.id_tv_desc);convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}viewHolder.avatar.setBackgroundResource((Integer) list.get(position).get("avatar"));viewHolder.title.setText((CharSequence) list.get(position).get("user_name"));viewHolder.desc.setText((CharSequence) list.get(position).get("user_ip"));return convertView;}private class ViewHolder {ImageView avatar;TextView title;TextView desc;}}


說明


BaseAdapter是一個很常用的Adapter,是一個抽象類別,需要重寫很多方法。

在Adapter中先調用getCount()方法,得到ListView的長度,根據這個長度逐一繪製ListView的每一行

onvertView相當於一個緩衝,開始為0,當有條目變為不可見,它緩衝了它的資料,後面再出來的條目只需要更新資料就可以了,這樣大大節省了系統資料的開銷


ViewHolder的應用 :


View的findViewById()方法也是比較耗時的,因此需要考慮只調用一次,之後就用convertView.getTag();方法來獲得ViewHolder對象。 


通俗的說,inflate就相當於將一個xml中定義的布局找出來.


因為在一個Activity裡如果直接用findViewById()的話,對應的是setConentView()的那個layout裡的組件.


因此如果你的Activity裡如果用到別的layout,比如對話方塊上的layout,你還要設定對話方塊上的layout裡的組件(像圖片ImageView,文字TextView)上的內容,你就必須用inflate()先將對話方塊上的layout找出來,然後再用這個layout對象去找到它上面的組件。


另外這裡有些BaseAdapter相關資料:

http://www.open-open.com/lib/view/open1339485728006.html

http://android.tgbus.com/Android/tutorial/201104/348009.shtml


Android學習筆記:ListView及BaseAdapter使用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.