Android之ListView
1.三種Adapter構建ListView
ListView新增條目的時候, 可以使用setAdapter(ListAdapter)方法, 常用的ListAdapter有三種
BaseAdapter: 定義一個類繼承BaseAdapter, 重寫4個抽象方法, ListView的條目是由getView()方法構建出來的
SimpleAdapter: 建立SimpleAdapter物件時, 傳入資料(List<Map<String, ?>>), 並指定資料的繫結關係
SimpleCursorAdapter: 建立SimpleCursorAdapter物件時, 傳入一個Cursor, 指定資料的繫結關係
2.監聽ListView的點選
呼叫ListView.setOnItemClickListener(OnItemClickListener)方法註冊一個監聽器
在監聽器的onItemClick()方法中使用 parent.getItemAtPosition(position) 方法可以獲取指定條目上的資料
BaseAdapter:返回的就是自定義的getItem()方法中返回的資料
SimpleAdapter:返回的是一個Map, 就是建立SimpleAdapter時List中的一個Map
SimpleCursorAdapter:返回的是一個Cursor, 這個Cursor就是建立時傳入的Cursor, 但是已經通過moveToPosition()方法指定到點選的索引了
一:BaseAdapter新增方式:
1.查詢出要被新增的資料
2.獲取ListView物件
3.建立一個類繼承BaseAdapter,實現其中的方法
4.給ListView物件設定介面卡personLV.setAdapter(new MyBaseAdapter());
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;
/**
* 注意:
* BaseAdapter生成的條目,進行Item點選事件監聽的時候,
* parent.getItemAtPosition(position)返回的是person物件
* 因為呼叫的是生成條目物件MyBaseAdapter類中的getItem方法
*
*/
public class BaseAdapterActivity extends Activity {
private ListView personLV;
private List<Person> persons;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao(getApplicationContext());
persons = dao.queryAll();//查詢資料
personLV = (ListView) findViewById(R.id.personLV);//獲取ListView
personLV.setAdapter(new MyBaseAdapter());//給ListView新增介面卡,按照adapter中的方法對ListView新增條目
personLV.setOnItemClickListener(new MyOnItemClickListener());//給條目新增條目點選監聽器
}
/**
* 點選事件監聽器
*/
private class MyOnItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Person p = (Person) parent.getItemAtPosition(position);//其實就是呼叫了MyBaseAdapter中的getItem方法,返回指定條目上的資料
Toast.makeText(getApplicationContext(), p.getId()+","+p.getName()+","+p.getBalance(), Toast.LENGTH_SHORT).show();
}
}
/**
* 將每個Person物件生成一個條目,將每個條目新增到ListView中
*/
private class MyBaseAdapter extends BaseAdapter {
public int getCount() {//返回ListView中要顯示的條目數量(說白了就是,person集合元素的個數)
return persons.size();
}
public Object getItem(int position) {//返回指定位置上的物件
return persons.get(position);
}
public long getItemId(int position) {//返回條目的id,從0開始
return position;
}
//返回指定位置上的View,新增到ListView中,也就是說Person集合有幾個元素就呼叫這個方法幾次,一次生成一個條目
public View getView(int position, View convertView, ViewGroup parent) {//因為螢幕最多顯示10個條目,上下移動的時候都是移動的時候建立的,而不是一次建立完的,convertView代表移出螢幕外的那個條目
Person person = persons.get(position);
/*
* inflate充氣的意思,理解為構建一個條目
* 引數一:上下文環境
* 引數二:item的佈局檔案
* 引數三:將item掛到哪個元件上,如果寫null,預設掛到ListView上
*/
/**
* 千萬要注意:
* 此時SQLiteNewActivity類中使用findViewById並不能找到條目中的id,name,balance元件
* 因為此時還沒載入到Activity中
* 所以需要靠item(條目)來獲取條目裡的元件
* item.findViewById
*
*/
View item = View.inflate(getApplicationContext(), R.layout.item, null);
TextView idTV = (TextView) item.findViewById(R.id.idTV);
TextView nameTV = (TextView) item.findViewById(R.id.nameTV);
TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV);
/**
* 千萬要注意:
* setText(CharSequence text)
* setText(int resid)
* 這個方法有過載,如果傳入int型別的值進去(比如person的id和balance)
* 程式會去找R檔案中內部類string中的值,所以肯定找不到
* 因此setText的時候務必轉成字串
*/
idTV.setText(person.getId()+"");
nameTV.setText(person.getName());
balanceTV.setText(person.getBalance()+"");
return item;
}
}
}
二.SimpleAdapter新增方式:
1.查詢出要被新增的資料
2.建立一個Map元素的List集合 List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
3.遍歷需要被新增的資料,將資料以鍵值對的方式加入到map集合中,再將Map集合加入到List集合
4.獲取ListView物件 ListView personLV = (ListView) findViewById(R.id.personLV);
5.給ListView設定介面卡
personLV.setAdapter(new SimpleAdapter(this, data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
/* SimpleAdapter傳入指定的資料和佈局檔案,以及匹配關係,自動生成View,裝入LsitView
* 引數一:上下文環境
* 引數二:資料,List<Map<String,Object>>,每個Person的資料裝入一個Map,將所有Map裝入List
* 引數三:佈局檔案的資源id,因為每個條目也有自己的佈局方式,這個佈局指的是每個item的佈局
* 引數四:Map中的key,和引數五中的id所對應的元件對應,將指定Key對應的Value,放入id對應的元件上
* 引數五:View中的id
*/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.xxc.dao.PersonDao;
import com.xxc.domain.Person;
/**
* 注意:
* SimpleAdapter生成的條目,進行Item點選事件監聽的時候,
* parent.getItemAtPosition(position)返回的是map集合
*
*/
public class SimpleAdapterActivity extends Activity {
private ListView personLV;
private List<Person> persons;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDao dao = new PersonDao(getApplicationContext());
persons = dao.queryAll();//查詢資料
personLV = (ListView) findViewById(R.id.personLV);//獲取ListView
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
//把每個Person的資料裝入一個map,再將所有map裝入list
for (Person p : persons) {
Map<String,Object> map = new HashMap<String, Object>();
map.put("id", p.getId());
map.put("name", p.getName());
map.put("balance", p.getBalance());
data.add(map);
}
/*
* 引數一:上下文環境
* 引數二:遍歷Person集合,將一個Person物件資料裝入Map集合,再將所有Map集合裝入List集合中
* 引數三:生成條目的佈局檔案
* 引數四:map中的key
* 引數五:條目中的元件id
* 引數四和引數五的意思是:
* 根據key去找map集合找到對應的value值,將value放到引數五中的元件中(先後順序)
*/
personLV.setAdapter(new SimpleAdapter(getApplicationContext(), data , R.layout.item, new String[]{"id","name","balance"}, new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));
personLV.setOnItemClickListener(new MyOnItemClickListener());//給條目新增條目點選監聽器
}
/**
* 點選事件監聽器
*/
private class MyOnItemClickListener implements OnItemClickListener {
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Map<String,Object> map = (Map<String, Object>) parent.getItemAtPosition(position);//其實就是呼叫了MyBaseAdapter中的getItem方法,返回Map
Toast.makeText(getApplicationContext(), map.get("name").toString(), Toast.LENGTH_SHORT).show();
}
}
}
三:SimpleCursorAdapter
1.查詢出要被新增的資料,返回的是一個Cursor型別物件
2.獲取ListView物件
3.在ListView上設定介面卡
注意:查詢出來的主鍵必須以_id命名,最好就是資料庫表中的主鍵列名就是_id,如果不能改變,就在查詢的時候取別名。
dao層
/**
* 查詢person表中所有記錄,返回 Cursor型別
*/
public Cursor queryAllCursor(){
SQLiteDatabase db = helper.getReadableDatabase();
Cursor c = db.query("person", new String[]{"id _id ","name","balance"}, null, null, null, null, "id DESC");
return c;
}
Activity
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class SimpleCursorAdapterActivity extends Activity {
private ListView personLV;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
PersonDaoNew dao = new PersonDaoNew(getApplicationContext());
Cursor c = dao.queryAllCursor();
personLV = (ListView) findViewById(R.id.personLV);
personLV.setAdapter(new SimpleCursorAdapter(this, R.layout.item, c,//
new String[]{"_id","name","balance"}, //
new int[]{R.id.idTV,R.id.nameTV,R.id.balanceTV}));//
/*
*引數一:上下文環境
*引數二:佈局檔案資源ID
*引數三:包含資料的遊標
*引數四:遊標中的列名
*引數五:條目中的元件ID,遊標中的資料就會放在這些元件上
*/
personLV.setOnItemClickListener(new MyOnItemClickListener());//新增監聽器
}
//監聽器的實現類
private class MyOnItemClickListener implements OnItemClickListener{
public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
Cursor c = (Cursor) parent.getItemAtPosition(position);
Toast.makeText(getApplicationContext(), c.getString(0), Toast.LENGTH_SHORT).show();
}
}
}
item.xml 條目的佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/idTV"
android:textSize="20sp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="1" />
<TextView
android:layout_weight="2"
android:id="@+id/nameTV"
android:layout_width="0dp"
android:textSize="20sp"
android:layout_height="wrap_content"
android:text="皮卡丘" />
<TextView
android:layout_weight="2"
android:id="@+id/balanceTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="1000"
android:textSize="20sp" />
</LinearLayout>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 這個是表頭的設定,下面拖動,表頭不會動 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:textSize="20sp"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="序號" />
<TextView
android:layout_weight="2"
android:layout_width="0dp"
android:textSize="20sp"
android:layout_height="wrap_content"
android:text="姓名" />
<TextView
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="餘額"
android:textSize="20sp" />
</LinearLayout>
<!-- 這個是表頭的設定,下面拖動,表頭不會動 -->
<ListView
android:id="@+id/personLV"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>
四:ArrayAdapter
最簡單的資料介面卡
Activity
package com.xxc.day4;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView array_lv = (ListView) findViewById(R.id.array_lv);
String[] objs = new String[]{"王立軍1","王立軍2","王立軍3","王立軍4","王立軍5","王立軍6"};
/**
* 引數一:上下文
* 引數二:資原始檔,是一個TextView,由android自己定義的
* 引數三:要顯示的資料
*/
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, objs);
array_lv.setAdapter(adapter);
}
}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/array_lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
相關文章
- android之豎直滾動控制元件-ListViewAndroid控制元件View
- android中的ListViewAndroidView
- android 設定listview高度AndroidView
- android:listView Button 焦點問題AndroidView
- Jtti:Android介面卡ListView如何使用?JttiAndroidView
- android NestedScrollView和ListView衝突問題AndroidView
- Android:ListView的擴充與進階AndroidView
- Flutter 案例學習之:ListViewFlutterView
- 直播app開發,Android ListView好友列表展示APPAndroidView
- Android ListView 進階——從列表中獲取值AndroidView
- 搭建直播平臺,Android ListView 長按刪除列表項AndroidView
- Android 列表(ListView、RecyclerView)不斷重新整理最佳實踐AndroidView
- Android ListView中複雜資料流的高效渲染(一)AndroidView
- flutter系列之:flutter中listview的高階用法FlutterView
- Flutter基礎(七)Scrolling Widget之ListView、GridView、PageViewFlutterView
- Flutter 基礎(七)Scrolling Widget 之 ListView、GridView、PageViewFlutterView
- ListView 之非同步載入圖片亂序View非同步
- android開發(3):列表listview的實現 | 下拉重新整理AndroidView
- QML::ListViewView
- (課程學習)Android必學-非同步載入 —— 監聽 ListViewAndroid非同步View
- Android回顧--(十) ListView的優化和多佈局複用AndroidView優化
- ListView優化View優化
- android開發中如何動態獲取listview中的item的值AndroidView
- Flutter - Listview 詳解FlutterView
- [譯]Flutter - 掌握ListViewFlutterView
- Android之android exported="false"作用AndroidExportFalse
- Flutter ListView 原始碼分析FlutterView原始碼
- ListView控制元件 1130View控制元件
- Flutter ListView 用法詳解FlutterView
- ListView FooterView HeaderView介紹ViewHeader
- Flutter 中 ListView 的使用FlutterView
- RecyclerView與ListView比較View
- Android之StrictModeAndroid
- Android之BroadcastReceiverAndroidAST
- Android之AlarmManagerAndroid
- Android之FragmentAndroidFragment
- Web 開發者如何理解 Flutter 佈局之 —— 5. ListView 和 ScrollBarWebFlutterView
- android開發 之 Bolts-AndroidAndroid
- 從0系統學Android--3.5 最常用和最難用的控制元件---ListViewAndroid控制元件View