您好,登錄后才能下訂單哦!
ListView是Android中常用的重要組件之一,基本上所有軟件基本都會使用ListView,所以要對ListView非常熟悉。
先看看程序效果圖:
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_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>
看了代碼應該就明白了我上面說的ListView內容條目的布局指的就是
這樣一條條的布局文件
另外一個布局文件,整個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>(); //三項,分別是圖片,大標題,內容 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}));*/ //設置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中先調用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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。