溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android學(xué)習(xí)筆記:ListView及BaseAdapter使用

發(fā)布時間:2020-08-01 07:48:56 來源:網(wǎng)絡(luò) 閱讀:520 作者:imjam 欄目:移動開發(fā)

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

先看看程序效果圖:

Android學(xué)習(xí)筆記:ListView及BaseAdapter使用

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

①布局文件:

在ListView程序中,布局文件相比其他普通控件會多出至少一個,其原因是還需要一個關(guān)于ListView里面內(nèi)容條目的布局文件。

內(nèi)容條目的布局文件 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_p_w_picpathview"
        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_p_w_picpathview"
        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_p_w_picpathview"
        android:layout_below="@id/id_tv_title"
        android:layout_marginLeft="15dp"
        android:textSize="18sp"
        android:text="long long ago story"/>
    
</RelativeLayout>

看了代碼應(yīng)該就明白了我上面說的ListView內(nèi)容條目的布局指的就是

Android學(xué)習(xí)筆記:ListView及BaseAdapter使用這樣一條條的布局文件


另外一個布局文件,整個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;
	
	@Override
	protected 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>();
		
		//三項,分別是圖片,大標(biāo)題,內(nèi)容
		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的方法
		/**
		 * 四個參數(shù)
		 * 第一個參數(shù)是當(dāng)前的Context
		 * 第二個參數(shù),是數(shù)據(jù)來源list
		 * 第三個第四個相當(dāng)于鍵值對的關(guān)系
		 */
/*		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}));*/
		
		//設(shè)置Adapter
		setListAdapter(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);
	}

	
	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int positionId) {
		return positionId;
	}

	//重要的重寫方法
	@Override
	public 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_p_w_picpathview);
			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中先調(diào)用getCount()方法,得到ListView的長度,根據(jù)這個長度逐一繪制ListView的每一行

onvertView相當(dāng)于一個緩存,開始為0,當(dāng)有條目變?yōu)椴豢梢?,它緩存了它的?shù)據(jù),后面再出來的條目只需要更新數(shù)據(jù)就可以了,這樣大大節(jié)省了系統(tǒng)資料的開銷


ViewHolder的應(yīng)用 :


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


通俗的說,inflate就相當(dāng)于將一個xml中定義的布局找出來.


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


因此如果你的Activity里如果用到別的layout,比如對話框上的layout,你還要設(shè)置對話框上的layout里的組件(像圖片ImageView,文字TextView)上的內(nèi)容,你就必須用inflate()先將對話框上的layout找出來,然后再用這個layout對象去找到它上面的組件。


另外這里有些BaseAdapter相關(guān)資料:

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

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


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI