一、事先準備:java
LisitView的基礎使用;android
學會熟練運用兩種適配器(ArrayAdapter數組適配器,SimpleAdapter簡單適配器);數據庫
學會熟練運用兩種監聽器(OnScrollListener滾動事件監聽,OnItemClickListener單擊事件監聽);數組
學會熟練運用適配器數據的刷新(notifyDataChanged).app
二、ListView:ide
Android系統中顯示列表的控件。每個ListView均可以包含不少個列表項。每個列表項都有不一樣的數據類型,就涉及到數據適配器。佈局
三、數據適配器:this
把複雜的數據(數組、鏈表、數據庫、集合等)填充到指定的視圖界面上。數據適配器是鏈接數據和師徒界面的橋樑。code
ArrayAdapter:數組適配器,用於綁定格式單一的數據,數據源能夠是集合或者數組;xml
SimpleAdapter:用於綁定格式複雜的數據,數據源只能是特定泛型的集合。
實現過程:新建適配器->添加數據源到適配器->視圖加載適配器
a、使用ArrayAdapter:
建立main.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="vertical" > <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
對MainActivity.java文件作以下修改
package com.example.myandroidlistview; import java.util.List; import android.R.anim; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { //對外聲明ListView及適配器 private ListView listView; private ArrayAdapter<String>arr_adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在Activity的方法建立中將ListView與他的佈局文件進行數據與視圖的綁定 listView=(ListView)findViewById(R.id.listView); //一、新建一個數據適配器 //ArrayAdapter(上下文,當前ListView加載的每個列表項所對應的佈局文件,數據源) //二、適配器加載數據源 String[]arr_data={"中國1","中國2","中國3","中國4"}; arr_adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr_data); //三、視圖(ListView)加載適配器 listView.setAdapter(arr_adapter); } }
b、使用Simpleadapter
建立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" > <ImageView android:id="@+id/pic" android:layout_marginLeft="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#000000" android:text="demo" /> </LinearLayout>
對MainActivity.java文件作以下修改
package com.example.myandroidlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.R.anim; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { //對外聲明ListView及適配器 private ListView listView; private SimpleAdapter simp_adapter; private List<Map<String,Object>>dataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在Activity的方法建立中將ListView與他的佈局文件進行數據與視圖的綁定 listView=(ListView)findViewById(R.id.listView); //一、新建一個數據適配器 //SimpleAdapter(上下文, // 數據源(List<? extends Map<String ?>>data)一個Map所組成deList集合 // (每個Map都會去對應ListView列表中的一行,每個Map(鍵-值對)中的鍵必須包含全部在from中所指定的鍵) // 列表項的佈局文件ID, // Map中的鍵名, // 綁定數據視圖中的ID(與from成對應關係) //二、適配器加載數據源 dataList=new ArrayList<Map<String,Object>>(); simp_adapter=new SimpleAdapter(this, getData(), R.layout.item, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text}); //三、視圖(ListView)加載適配器 listView.setAdapter(simp_adapter); } private List<Map<String,Object>> getData() { for (int i = 0; i < 20; i++) { Map<String,Object>map=new HashMap<String, Object>(); map.put("pic", R.drawable.ic_launcher); map.put("text", "中國"+i); dataList.add(map); } return dataList; } }
四、監聽器:
Android提供了不少事件監聽器,監聽器主要是爲了去響應某個動做,(動做的發起者可使用戶的操做也能夠是Android系統自己),咱們能夠經過監控這種動做行爲,來完成咱們須要的程序功能。 監聽器是程序和用戶(或系統)交互的橋樑;
OnItemClickListener:能夠處理視圖中單個條目的點擊事件;
OnScrollListener:檢測滾動的變化,能夠用於試圖在滾動中加載數據;
實現過程:視圖直接設置監聽器,在相關的實現方法中補充須要的代碼便可
a、使用OnItemClickListener:
對MainActivity.java文件作以下修改
package com.example.myandroidlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.R.anim; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity implements OnItemClickListener,OnScrollListener{ //對外聲明ListView及適配器 private ListView listView; private ArrayAdapter<String>arr_adapter; private SimpleAdapter simp_adapter; private List<Map<String,Object>>dataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在Activity的方法建立中將ListView與他的佈局文件進行數據與視圖的綁定 listView=(ListView)findViewById(R.id.listView); //一、新建一個數據適配器 //ArrayAdapter(上下文,當前ListView加載的每個列表項所對應的佈局文件,數據源) //SimpleAdapter(上下文, // 數據源(List<? extends Map<String ?>>data)一個Map所組成deList集合 // (每個Map都會去對應ListView列表中的一行,每個Map(鍵-值對)中的鍵必須包含全部在from中所指定的鍵) // 列表項的佈局文件ID, // Map中的鍵名, // 綁定數據視圖中的ID(與from成對應關係) //二、適配器加載數據源 String[]arr_data={"中國1","中國2","中國3","中國4"}; dataList=new ArrayList<Map<String,Object>>(); arr_adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr_data); simp_adapter=new SimpleAdapter(this, getData(), R.layout.item, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text}); //三、視圖(ListView)加載適配器 //listView.setAdapter(arr_adapter); listView.setAdapter(simp_adapter); listView.setOnItemClickListener(this); listView.setOnScrollListener(this); } private List<Map<String,Object>> getData() { for (int i = 0; i < 20; i++) { Map<String,Object>map=new HashMap<String, Object>(); map.put("pic", R.drawable.ic_launcher); map.put("text", "中國"+i); dataList.add(map); } return dataList; } @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub String text=listView.getItemAtPosition(position)+""; Toast.makeText(this, "position="+position+" text="+text, Toast.LENGTH_SHORT).show(); } }
a、使用OnScrollListener:
對MainActivity.java文件作以下修改
package com.example.myandroidlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.R.anim; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity implements OnItemClickListener,OnScrollListener{ //對外聲明ListView及適配器 private ListView listView; private ArrayAdapter<String>arr_adapter; private SimpleAdapter simp_adapter; private List<Map<String,Object>>dataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在Activity的方法建立中將ListView與他的佈局文件進行數據與視圖的綁定 listView=(ListView)findViewById(R.id.listView); //一、新建一個數據適配器 //ArrayAdapter(上下文,當前ListView加載的每個列表項所對應的佈局文件,數據源) //SimpleAdapter(上下文, // 數據源(List<? extends Map<String ?>>data)一個Map所組成deList集合 // (每個Map都會去對應ListView列表中的一行,每個Map(鍵-值對)中的鍵必須包含全部在from中所指定的鍵) // 列表項的佈局文件ID, // Map中的鍵名, // 綁定數據視圖中的ID(與from成對應關係) //二、適配器加載數據源 String[]arr_data={"中國1","中國2","中國3","中國4"}; dataList=new ArrayList<Map<String,Object>>(); arr_adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr_data); simp_adapter=new SimpleAdapter(this, getData(), R.layout.item, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text}); //三、視圖(ListView)加載適配器 //listView.setAdapter(arr_adapter); listView.setAdapter(simp_adapter); listView.setOnItemClickListener(this); listView.setOnScrollListener(this); } private List<Map<String,Object>> getData() { for (int i = 0; i < 20; i++) { Map<String,Object>map=new HashMap<String, Object>(); map.put("pic", R.drawable.ic_launcher); map.put("text", "中國"+i); dataList.add(map); } return dataList; } @Override public void onScroll(AbsListView arg0, int scrollState, int arg2, int arg3) { // TODO Auto-generated method stub switch(scrollState){ case SCROLL_STATE_FLING: Log.i("Main","用戶在手指離開屏幕以前,因爲用力滑了一下,使視圖仍然向下滑動"); break; case SCROLL_STATE_IDLE: Log.i("Main","視圖已經中止滑動"); break; case SCROLL_STATE_TOUCH_SCROLL: Log.i("Main","手指沒有離開屏幕,視圖正在滑動"); break; } } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub String text=listView.getItemAtPosition(position)+""; Toast.makeText(this, "position="+position+" text="+text, Toast.LENGTH_SHORT).show(); } }
調用順序:
五、動態刷新添加數據源:
對MainActivity.java文件作以下修改
package com.example.myandroidlistview; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.R.anim; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; public class MainActivity extends Activity implements OnItemClickListener,OnScrollListener{ //對外聲明ListView及適配器 private ListView listView; private ArrayAdapter<String>arr_adapter; private SimpleAdapter simp_adapter; private List<Map<String,Object>>dataList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //在Activity的方法建立中將ListView與他的佈局文件進行數據與視圖的綁定 listView=(ListView)findViewById(R.id.listView); //一、新建一個數據適配器 //ArrayAdapter(上下文,當前ListView加載的每個列表項所對應的佈局文件,數據源) //SimpleAdapter(上下文, // 數據源(List<? extends Map<String ?>>data)一個Map所組成deList集合 // (每個Map都會去對應ListView列表中的一行,每個Map(鍵-值對)中的鍵必須包含全部在from中所指定的鍵) // 列表項的佈局文件ID, // Map中的鍵名, // 綁定數據視圖中的ID(與from成對應關係) //二、適配器加載數據源 String[]arr_data={"中國1","中國2","中國3","中國4"}; dataList=new ArrayList<Map<String,Object>>(); arr_adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, arr_data); simp_adapter=new SimpleAdapter(this, getData(), R.layout.item, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text}); //三、視圖(ListView)加載適配器 //listView.setAdapter(arr_adapter); listView.setAdapter(simp_adapter); listView.setOnItemClickListener(this); listView.setOnScrollListener(this); } private List<Map<String,Object>> getData() { for (int i = 0; i < 20; i++) { Map<String,Object>map=new HashMap<String, Object>(); map.put("pic", R.drawable.ic_launcher); map.put("text", "中國"+i); dataList.add(map); } return dataList; } @Override public void onScroll(AbsListView arg0, int scrollState, int arg2, int arg3) { // TODO Auto-generated method stub switch(scrollState){ case SCROLL_STATE_FLING: Log.i("Main","用戶在手指離開屏幕以前,因爲用力滑了一下,使視圖仍然向下滑動"); Map<String, Object>map=new HashMap<String, Object>(); map.put("pic", R.drawable.ic_launcher); map.put("text", "增長項"); dataList.add(map); simp_adapter.notifyDataSetChanged(); break; case SCROLL_STATE_IDLE: Log.i("Main","視圖已經中止滑動"); break; case SCROLL_STATE_TOUCH_SCROLL: Log.i("Main","手指沒有離開屏幕,視圖正在滑動"); break; } } @Override public void onScrollStateChanged(AbsListView arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub String text=listView.getItemAtPosition(position)+""; Toast.makeText(this, "position="+position+" text="+text, Toast.LENGTH_SHORT).show(); } }