1. 程式人生 > >你真的瞭解Android ListView嗎?

你真的瞭解Android ListView嗎?

什麼是Android ListView?

ListView是一個顯示可滾動的專案列表檢視組。 該列表中的專案使用的是自動插入到列表Adapter ,拉從源內容,如陣列或資料庫查詢,把每個專案導如成被放置到列表的檢視。

在android開發中ListView是比較常用的元件,它以列表的形式展示具體內容,並且能夠根據資料的長度自適應顯示。

說到ListView就不得不說Adapter介面卡,因為只有通過Adapter才可以把列表中的資料對映到ListView中。

在android的開發中最Adapter 一共可以分為

  • ArrayAdapter
  • BaseAdapter
  • CursorAdapter
  • HeaderViewListAdapter
  • ResourceCursorAdapter
  • SimpleAdapter
  • SimpleCursorAdapter
  • WrapperListAdapter

軟體開發中最常用的有ArrayAdapter, BaseAdapter, SimpleAdapter。

ListView的例項

簡單的ListView

在List列表中如果不存在過於複雜的東西 我們可以直接去new ArrayAdapter() 來繪製列表,無須繼承ArrayAdapter,重寫它的方法。但是如果列表中過於複雜的話就需要使用自定義佈局來實現List列表。

public
class SimpleList extends ListActivity { private String[] mListStr = {"姓名:哈哈","性別:男","年齡:25","居住地:北京","郵箱:[email protected]"}; ListView mListView = null; @Override protected void onCreate(Bundle savedInstanceState) { mListView = getListView(); setListAdapter(new ArrayAdapter<String>(this
, android.R.layout.simple_list_item_1, mListStr)); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Toast.makeText(SimpleList.this,"您選擇了" + mListStr[position], Toast.LENGTH_LONG).show(); } }); super.onCreate(savedInstanceState); } }

帶標題的ListView列表

使用 simpleAdapter 需要注意的是須要用Map<String,Object> item 來儲存列表中每一項的顯示的title與text , new SimpleAdapter的時候將map中的資料寫入 ,程式就會幫我們繪製列表了。

public class TitleList extends ListActivity {
 private String[] mListTitle = { "姓名", "性別", "年齡", "居住地","郵箱"};
 private String[] mListStr = { "哈哈", "男", "25", "北京",
 "[email protected]" };
 ListView mListView = null;
 ArrayList<Map<String,Object>> mData= new ArrayList<Map<String,Object>>();;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 mListView = getListView();

 int lengh = mListTitle.length;
 for(int i =0; i < lengh; i++) {
 Map<String,Object> item = new HashMap<String,Object>();
 item.put("title", mListTitle[i]);
 item.put("text", mListStr[i]);
 mData.add(item);
 }
 SimpleAdapter adapter = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2,
 new String[]{"title","text"},new int[]{android.R.id.text1,android.R.id.text2});
 setListAdapter(adapter);
 mListView.setOnItemClickListener(new OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> adapterView, View view, int position,
 long id) {
 Toast.makeText(TitleList.this,"您選擇了標題:" + mListTitle[position] + "內容:"+mListStr[position], Toast.LENGTH_LONG).show();
 }
 });
 super.onCreate(savedInstanceState);
 }
}

帶圖片的ListView列表

使用 simpleAdapter 來操作 但是構造simpleAdapter的時候須要使用我們自己寫的佈局來完成 ,因為系統的佈局已經不能滿足需求了,同樣Map<String,Object> item 來儲存列表中每一項須要的顯示內容 如 圖片 標題 內容等。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight">
 <ImageView android:id="@+id/image"
 android:layout_width="wrap_content" android:layout_height="fill_parent"
 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"
 android:adjustViewBounds="true"
 android:padding="2dip" />
 <TextView android:id="@+id/title"
 android:layout_width="wrap_content" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/image"
 android:layout_alignParentRight="true" android:layout_alignParentTop="true"
 android:layout_above="@+id/text"
 android:layout_alignWithParentIfMissing="true" android:gravity="center_vertical"
 android:textSize="15dip" />
 <TextView android:id="@+id/text"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/image"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true" android:singleLine="true"
 android:ellipsize="marquee"
 android:textSize="20dip" />
</RelativeLayout>

MainActivity.java

public class MainActivity extends ListActivity {
 private String[] mListTitle = { "姓名", "性別", "年齡", "居住地","郵箱"};
 private String[] mListStr = { "哈哈", "男", "25", "北京",
 "[email protected]" };
 ListView mListView = null;
 ArrayList<Map<String,Object>> mData= new ArrayList<Map<String,Object>>();;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 mListView = getListView();

 int lengh = mListTitle.length;
 for(int i =0; i < lengh; i++) {
 Map<String,Object> item = new HashMap<String,Object>();
 item.put("image", R.drawable.jay);
 item.put("title", mListTitle[i]);
 item.put("text", mListStr[i]);
 mData.add(item);
 }
 SimpleAdapter adapter = new SimpleAdapter(this,mData,R.layout.iconlist,
 new String[]{"image","title","text"},new int[]{R.id.image,R.id.title,R.id.text});
 setListAdapter(adapter);
 mListView.setOnItemClickListener(new OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> adapterView, View view, int position,
 long id) {
 Toast.makeText(IconList.this,"您選擇了標題:" + mListTitle[position] + "內容:"+mListStr[position], Toast.LENGTH_LONG).show();
 }
 });
 super.onCreate(savedInstanceState);
 }
}

自定義佈局BaseAdapter修改列表顏色

因為通過直接 構造系統的佈局來繪製列表方法肯定是有限的,所以我們需要重寫繪製方法 ,寫一個類去繼承BaseAdapter 並實現這個類中的方法,listView在一開始繪製的時候首先會呼叫getCout()方法得到繪製次數 ,然後會例項化自己定義的BaseAdapter通過getView()方法一層一層繪製ListView,所以我們可以在這裡面根據position(當前繪製的ID)來任意的修改繪製的內容,做出好看漂亮的ListView,下面這個例子我通過重寫getView修改每個列表的顏色 並且實現使用者選中後成高亮狀態。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="wrap_content">
 <ImageView android:id="@+id/color_image"
 android:layout_width="wrap_content" android:layout_height="fill_parent"
 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"
 android:adjustViewBounds="true"
 android:padding="2dip" />
 <TextView android:id="@+id/color_title"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/color_image"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true" android:singleLine="true"
 android:ellipsize="marquee"
 android:textSize="15dip" />
 <TextView android:id="@+id/color_text"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/color_image"
 android:layout_below="@+id/color_title"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true"
 android:singleLine="true"
 android:ellipsize="marquee"
 android:textSize="20dip" />
</RelativeLayout>

MianActivity.java

public class MianActivity extends ListActivity {
 private String[] mListTitle = { "姓名", "性別", "年齡", "居住地","郵箱"};
 private String[] mListStr = { "哈哈", "男", "25", "北京",
 "[email protected]" };
 ListView mListView = null;
 MyListAdapter myAdapter = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 mListView = getListView();
 myAdapter = new MyListAdapter(this);
 setListAdapter(myAdapter);
 mListView.setOnItemClickListener(new OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> adapterView, View view, int position,
 long id) {
 View v=adapterView.getChildAt(position);
 v.setBackgroundColor(Color.RED);
 Toast.makeText(ColorList.this,"您選擇了" + mListStr[position], Toast.LENGTH_LONG).show();
 }
 });

 super.onCreate(savedInstanceState);
 }

 class MyListAdapter extends BaseAdapter {
 private int[] colors = new int[] { 0xff626569, 0xff4f5257 };
 public MyListAdapter(Context context) {
 mContext = context;
 }

 public int getCount() {
 return mListStr.length;
 }

 @Override
 public boolean areAllItemsEnabled() {
 return false;
 }

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

 public long getItemId(int position) {
 return position;
 }

 public View getView(int position, View convertView, ViewGroup parent) {
 ImageView iamge = null;
 TextView title = null;
 TextView text = null;
 if (convertView == null) {
 convertView = LayoutInflater.from(mContext).inflate(R.layout.colorlist, null);
 iamge = (ImageView) convertView.findViewById(R.id.color_image);
 title =(TextView) convertView.findViewById(R.id.color_title);
 text= (TextView) convertView.findViewById(R.id.color_text);
 }
 int colorPos = position % colors.length;
 convertView.setBackgroundColor(colors[colorPos]);
 title.setText(mListTitle[position]);
 text.setText(mListStr[position]);
 iamge.setImageResource(R.drawable.jay);
 return convertView;
 }

 private Context mContext;
 }
}

自定義佈局ArrayAdapter

ArrayAdapter是BaseAdapter的子類,ArrayAdapter不僅具有BaseAdapter的所有方法還自定義了一些新的方法來處理列表項,所以單純的從功能能上來講ArrayAdapter遠遠強與BaseAdapter,如果是繪製一些數量比較少的列表建議使用BaseAdapter 如果繪製一些比較複雜的列表項 並且列表項很多的 建議使用ArrayAdapter。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent" android:layout_height="wrap_content">
 <Button
 android:id="@+id/array_button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="使用者"
 />
 <ImageView android:id="@+id/array_image"
 android:layout_toRightOf="@+id/array_button"
 android:layout_width="wrap_content" android:layout_height="fill_parent"
 android:layout_alignParentTop="true" android:layout_alignParentBottom="true"
 android:adjustViewBounds="true"
 android:padding="2dip" />
 <TextView android:id="@+id/array_title"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/array_image"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true" android:singleLine="true"
 android:ellipsize="marquee"
 android:textSize="15dip" />
 <TextView android:id="@+id/array_text"
 android:layout_width="fill_parent" android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/array_image"
 android:layout_below="@+id/array_title"
 android:layout_alignParentBottom="true"
 android:layout_alignParentRight="true"
 android:singleLine="true"
 android:ellipsize="marquee"
 android:textSize="20dip" />

</RelativeLayout>

MianActivity.java

public class ArrayList extends ListActivity {
 private String[] mListTitle = { "姓名", "性別", "年齡", "居住地","郵箱"};
 private String[] mListStr = { "哈哈", "男", "25", "北京",
 "[email protected]" };
 ListView mListView = null;
 MyListAdapter myAdapter = null;
 ArrayList arrayList = null;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 arrayList = this;
 mListView = getListView();
 myAdapter = new MyListAdapter(this,R.layout.arraylist);
 setListAdapter(myAdapter);
 super.onCreate(savedInstanceState);
 }

 public class MyListAdapter extends ArrayAdapter<Object> {
 int mTextViewResourceID = 0;
 private Context mContext;
 public MyListAdapter(Context context, int textViewResourceId) {
 super(context, textViewResourceId);
 mTextViewResourceID = textViewResourceId;
 mContext = context;
 }

 private int[] colors = new int[] { 0xff626569, 0xff4f5257 };

 public int getCount() {
 return mListStr.length;
 }

 @Override
 public boolean areAllItemsEnabled() {
 return false;
 }

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

 public long getItemId(int position) {
 return position;
 }

 public View getView(final int position, View convertView, ViewGroup parent) {
 ImageView iamge = null;
 TextView title = null;
 TextView text = null;
 Button button = null;
 if (convertView == null) {
 convertView = LayoutInflater.from(mContext).inflate(
 mTextViewResourceID, null);
 iamge = (ImageView) convertView.findViewById(R.id.array_image);
 title = (TextView) convertView.findViewById(R.id.array_title);
 text = (TextView) convertView.findViewById(R.id.array_text);
 button = (Button)convertView.findViewById(R.id.array_button);
 button.setOnClickListener(new OnClickListener() {

 @Override
 public void onClick(View arg0) {
 Toast.makeText(arrayList,"您點選的第"+position +"個按鈕", Toast.LENGTH_LONG).show();

 }
 });
 }
 int colorPos = position % colors.length;
 convertView.setBackgroundColor(colors[colorPos]);
 title.setText(mListTitle[position]);
 text.setText(mListStr[position]);
 if(colorPos == 0)
 iamge.setImageResource(R.drawable.jay);
 else
 iamge.setImageResource(R.drawable.image);
 return convertView;
 }
 }
}

相關推薦

真的瞭解Android ListView

什麼是Android ListView? ListView是一個顯示可滾動的專案列表檢視組。 該列表中的專案使用的是自動插入到列表Adapter ,拉從源內容,如陣列或資料庫查詢,把每個專案導如成被放置到列表的檢視。 在android開發中ListView是

校園網路安全CTF 第一題 和 瞭解

第一題: 需要先找到相應頭(REsponse header中的tips)   <?php$flag = "***";if (isset($_GET['repo']))//檢測變數是否設定 { if (strcmp($_GET['repo'], $flag) == 0) //比較兩個

Android Studio新功能解析,真的瞭解Instant Run

轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/51271369 本篇文章首發於我的微信公眾號,由於網上講解Android Studio中Instant Run功能的文章實在是太少了,為了讓更多

真的瞭解[super ]關鍵字

前言 此篇文章是看了阮老師的es6教程,看到super關鍵字的時候覺得有必要總結梳理一下,原文還是參考 ECMAScript 6入門。 正文 super 這個關鍵字,既可以當作函式使用,也可以當作物件使用。 1.當作函式使用 super作為函式呼叫時,代表父類的建構函式。ES6 要

真的瞭解新媒體?黎想將淺談一個成功的新媒體所必須具備的基本要素?

在正式介紹前,為了幫助大家更好的瞭解新媒體,避免認識上的誤區。藝形藝意工作室創始人、騰訊網、百度網、搜狐網知名專欄作者黎想將首先教你用一招輕鬆區別的方法: 新媒體涵蓋了所有數字化的媒體形式,包括所有數字化的傳統媒體、網路媒體、移動端媒體、數字電視、數字報刊雜誌等;自媒體是基於擁有眾多粉絲

Java中執行緒池,真的瞭解會用

在《 深入原始碼分析Java執行緒池的實現原理 》這篇文章中,我們介紹過了Java中執行緒池的常見用法以及基本原理。 在文中有這樣一段描述: 可以通過Executors靜態工廠構建執行緒池,但一般不建議這樣使用。 關於這個問題,在那篇文章中並沒有深入的展開。作者之所以這

遇見未來 | 讀完這篇文章,真的瞭解超融合

超融合的概念自2012年被提出到現在,經歷了6年的時間。其技術已經從最初的以儲存的融合為重點,經歷過計算、儲存、網路的全面融合,到現在,重心落在雲端計算平臺的交付,整個技術趨於成熟。   今天我們有幸邀請到青雲QingCloud青立方產品總監廖洋(Lester)老師,請

真的瞭解volatile關鍵字

一、Java記憶體模型想要理解volatile為什麼能確保可見性,就要先理解Java中的記憶體模型是什麼樣的。Java記憶體模型規定了所有的變數都儲存在主記憶體中。每條執行緒中還有自己的工作記憶體,執行緒的工作記憶體中儲存了被該執行緒所使用到的變數(這些變數是從主記憶體中拷貝

真的瞭解Instant Run

在Instant Run剛出來的時候,反編譯原始碼寫過一篇Instant Run原理解析,但過於基於原始碼,感覺沒有寫清楚,這周Android Developers推出了Instant Run: An Android Tool Time Deep Dive來講解Inst

真的瞭解計算機除法

前不久看了《C++反彙編與逆向分析技術揭祕》看到除法的介紹部分,裡面有1道題,8 % -3 = ?;-8 % -3 = ?;-8 % 3 = ?;大家能答的上來嗎?反正我當時是沒答上來,我想肯定很多人也一時答不上來,下面是上題的答案:               8 % -

深入淺出ES6(一):真的瞭解箭頭函式

前言 這個系列主要是說明ES6的新特性,從2015年到現在,es6出來也有挺長一段時間了,在專案中也在普遍使用這些特性.,網上的寫es6的文章也大把, 但我感覺可能還是停留在會用的階段,,至於為什麼要這麼用, 又為什麼會出現這個特性,解決了什麼樣的問題,這些都

真的瞭解分層架構?——寫給被PetShop"毒害"的朋友們

一葉障目 .NET平臺上的分層架構(很多朋友稱其為“三層架構”),似乎是一個長盛不衰的話題。經常看到許多朋友對其進行分析、探討、辯論甚至是抨擊。筆者在仔細閱讀了大量這方面文章後,認為許多朋友在分層架構的理解上存在兩個比較大的偏頗: 1.沒有從本質角度去理解分層的內涵,而只

真的瞭解模運算?

問題 假設我們需要編寫一個字母表右移對映的程式(可能用於實現某種加密演算法),說起來似乎有些抽象,舉個例子便清晰了: 譬如字母表為 { ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ }, 右移3位的話, 字母表便被對映為 { ‘d’, ‘e’, ‘a’,

真的瞭解單例

    又到了一個老生常談的話題,單例模式,可能在面試時我們也經常會遇到,但是看似很簡單的問題,卻能看出一個人對單例理解的深度。要寫一個單例,首先需要讓構造器私有,還需要對外提供一個可以獲取單例的一個入口,通常我們可能會這樣寫:第一種:public class SingleT

真的瞭解Grid佈局

Grid網格佈局 概述:Grid將容器劃分為一個個網格,通過任意組合不同的網格,做出你想想要的佈局 Grid與flex佈局相似,將整個Grid分為了容器與子項(格子)   Grid容器的三個重要的概念: 行和列 單元格 網格線   行和列 行和列的概念和柵格系統的的概念相似 單元格在水

真的瞭解Object原始碼

歡迎點贊閱讀,一同學習交流,有疑問請留言 。 GitHub上也有開源 JavaHouse 歡迎star 引入 Object 應該是比較簡單的原始碼了。現在我們來分析一下他。Object 是類層次結構的根。Java體系裡面的每個類預設都有一個超類就是 Object。總之,所有物件,包含陣列,都預設實現該類的

JavaScript 真的瞭解this指向

JavaScript 你真的瞭解this指向嗎 前言   終於開始寫this指向了,相信這對很多JavaScript的學習者來說是一個非常恐怖的環節,個人認為也算是JavaScript中最難理解的一個知識點,this非常的方便但是在你不熟悉它的情況下可能會出現很多坑。   本篇文章將帶你充分了解this指

真的瞭解串列埠(示波器串列埠波形分析)

串列埠是最常用的外設了,串列埠基本都是微控制器的標配。串列埠通訊只需要3條線組成,分別為RX、TX、GND。下面將重點分析串列埠資料幀組成。 一、    串列埠通訊幀  串列埠通訊幀資料如此,每幀由空閒位、起始位、資料位、校驗位、停止位組成 傳輸的資料是低位在前高位

Android 許可權機制,真的瞭解

一、Android的許可權機制 Android是目前最流行的智慧手機軟體平臺之一,在智慧移動終端如火如荼發展的同時,其安全態勢也日益嚴峻。有調查表明,惡意軟體的數量在持續的上升,Google在Android安全機制上面也做了很多工作,並且一直在持續的更新,其Android的

Android:四大架構的優缺點,真的瞭解

前言 前不久剛結束對 20 模組專案的第 3 輪重構,一路見證 MVC、MVP、Clean 的優缺點並形成自己的體會。 近期在總結工作經驗的同時,開始寫部落格。順便開源了我設計的 ViaBus 架構。 專案常用架構比對 以下,對常見的 MVC、MVP、Clean、AAC 架構做個比對。 首先,一張表格展示