【聲明】html
歡迎轉載,但請保留文章原始出處→_→java
生命壹號:http://www.cnblogs.com/smyhvae/android
文章來源:http://www.cnblogs.com/smyhvae/p/3910884.html微信
【正文】app
內容簡介:ide
• 一、基本的XML配置佈局
• 二、ListActivitypost
• 三、單選和多選模式學習
• 四、ListView實現圖文列表優化
• 五、ListView刷新分頁
1、基本的 XML配置:
在ListView中加載本地數據,有兩種方式,下面舉例說明:(固然了,在這以前咱們須要在佈局文件activity_main.xml中添加一個ListView控件)
【方式一】:在xml文件中添加靜態數據的方式:
在res/values/string.xml文件中, 添加一組靜態數據,做爲列表中將要填充的內容,代碼以下
1 <?xml version="1.0" encoding="utf-8"?> 2 <resources> 3 <string name="app_name">smyh005_ListView</string> 4 <string name="action_settings">Settings</string> 5 <string name="hello_world">Hello world!</string> 6 7 <string-array name="names"> 8 <item >生命壹號</item> 9 <item >生命壹號</item> 10 <item >生命壹號</item> 11 <item >生命壹號</item> 12 <item >生命壹號</item> 13 <item >生命壹號</item> 14 <item >生命壹號</item> 15 <item >生命壹號</item> 16 <item >生命壹號</item> 17 </string-array> 18 19 </resources>
緊接着,在佈局文件的ListView控件中,添加以下屬性:
android:entries="@array/names"
而後設置一下ListView的其餘屬性。這樣,運行後,就能夠顯示一個簡單的列表了。
【方式二】在java代碼中來添加數據:
1 public class MainActivity extends Activity { 2 private ListView listView; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 listView = (ListView) findViewById(R.id.listView1); 8 String[] names = { "生命壹號", "生命壹號", "生命壹號", "生命壹號", "生命壹號", "生命壹號" }; 9 //第二個參數,也能夠新建一個佈局文件,在這個佈局文件的TextView當中設置其餘屬性。由於每一個Item自己就是一個TextView 10 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 11 android.R.layout.simple_list_item_1, names); 12 listView.setAdapter(adapter); 13 }
【事件處理】
事件處理的監聽器爲:OnItemClickListener。
方法舉例以下:(將當前點擊的那個item的文本以吐司的方式顯示出來)
1 listView1.setOnItemClickListener(new OnItemClickListener(){ 2 3 //ListView的列表項的單擊事件 4 @Override 5 //第一個參數:指的是這個ListView;第二個參數:當前單擊的那個item 6 public void onItemClick(AdapterView<?> parent, View view, int position, 7 long id) { 8 System.out.println("parent="+parent.getClass()); 9 System.out.println("view="+view.getClass()); 10 11 //既然當前點擊的那個item是一個TextView,那咱們能夠將其強制轉型爲TextView類型,而後經過getText()方法取出它的內容,緊接着以吐司的方式顯示出來 12 TextView tv = (TextView)view; 13 Toast.makeText(MainActivity.this,tv.getText(),Toast.LENGTH_SHORT).show();//方法: Toast makeText (Context context, CharSequence text, int duration) 14 15 System.out.println("position="+position); 16 System.out.println("id="+id); 17 18 } 19 20 });
上面的第十二、13行代碼也能夠替換成下面的這行代碼:(由於經過adapter的getItem方法也能夠獲取對應Item,返回值類型是咱們以前定義好的String類型)
Toast.makeText(MainAcivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show;
運行效果以下:
2、ListActivity
(1)若是程序的窗口僅僅只須要顯示一個列表,則可讓這個activity直接繼承ListActivity來實現,此時已經包含了一個ListView組件,不用再從新寫佈局文件了。
代碼舉例以下:
1 package com.smyhvae.smyh005listview; 2 import android.app.ListActivity; 3 import android.os.Bundle; 4 import android.widget.ArrayAdapter; 5 public class SecondActivity extends ListActivity{ 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 // TODO Auto-generated method stub 9 super.onCreate(savedInstanceState); 10 //經過代碼設置ListView中的內容 11 String[] names = {"生命壹號","生命壹號","生命壹號","生命壹號","生命壹號","生命壹號"}; 12 //經過ArrayAdaper將names的內容填充進去 13 //方法:public ArrayAdapter (Context context, int resource, int textViewResourceId),第二個參數爲佈局 14 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names); 15 // adpter和ListView進行綁定 16 setListAdapter(adapter); 17 18 //注:經過getListView()能夠取出這個ListView 19 } 20 }
運行後,也能顯示出一個ListView。
(2)事件處理
事件處理的方法爲:onListItemClick();
ListActiviy這個類中已經包含了事件處理的監聽器,因此咱們只須要複寫其中的onListItemClick()便可:
1 //重寫ListActivity中的onListItemClick方法來實現列表項的單擊事件 2 @Override 3 protected void onListItemClick(ListView l, View v, int position, long id) { 4 // TODO Auto-generated method stub 5 super.onListItemClick(l, v, position, id); 6 }
(3)ListActivity的佈局默認是由一個單一的在屏幕中心的全屏幕的列表,用setcontentview()在在oncreate()設置您本身的自定義屏幕布局視圖佈局,必須包含一個列表視圖的對象ID:"@android:id/list「
(4)自定義視圖能夠包含任何類型,顯示另外一個視圖對象列表視圖是空的,必須包含一個視圖對象的ID:android:id/empty。
3、單選和多選模式:
單選模式:
1 String[] cities = { "北京", "成都", "重慶", "武漢" }; 2 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 3 android.R.layout.simple_list_item_single_choice, cities); 4 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
多選模式:
1 String[] cities = { "北京", "成都", "重慶", "武漢" }; 2 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 3 android.R.layout.simple_list_item_multiple_choice, cities); 4 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
5、ListView實現圖文列表:
一、使用SimpleAdapter創建複雜的列表項:
使用到的方法是:
android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
舉例說明,完整版代碼以下:
佈局文件activity3.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/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout>
下面新建一個佈局文件activity_main_item.xml,做爲一個Item的模板:
<?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="wrap_content" android:orientation="horizontal" android:gravity="center" > <ImageView android:id="@+id/imageView1" android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/vae" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" android:textSize="20sp" /> </LinearLayout>
這個佈局文件展現的效果以下:
而後,MainActivity.java的代碼以下:
1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 import android.app.Activity; 6 import android.os.Bundle; 7 import android.view.Menu; 8 import android.widget.ListView; 9 import android.widget.SimpleAdapter; 10 public class MainActivity extends Activity { 11 private ListView listView; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 listView = (ListView) findViewById(R.id.listView1); 17 //步驟1 一個列表項的內容,就是一個item 18 Map<String, Object> item1 = new HashMap<String, Object>(); 19 item1.put("image", R.drawable.vae); 20 item1.put("name", "許嵩"); 21 //步驟1:一個列表項的內容,就是一個item,即一個Map 22 Map<String, Object> item2 = new HashMap<String, Object>(); 23 item2.put("image", R.drawable.smyh); 24 item2.put("name", "生命壹號"); 25 26 //步驟2:把這些Map放到List當中 27 List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); 28 data.add(item1); 29 data.add(item2); 30 31 //注意:第四個參數和第五個參數要一一對應 32 SimpleAdapter simpleAdapter = new SimpleAdapter(this, data, 33 R.layout.activity_main_item, new String[] { "image", "name" }, 34 new int[] { R.id.imageView1, R.id.textView1 }); 35 36 //步驟3:將List中的內容填充到listView裏面去 37 listView.setAdapter(simpleAdapter); 38 } 39 @Override 40 public boolean onCreateOptionsMenu(Menu menu) { 41 // Inflate the menu; this adds items to the action bar if it is present. 42 getMenuInflater().inflate(R.menu.main, menu); 43 return true; 44 } 45 }
運行後,效果以下:
【工程文件】
連接:http://pan.baidu.com/s/1pJLmvJt
密碼:q63j
若是item比較多的話,能夠用for循環來作
二、自定義適配器BaseAdapter實現更靈活的列表:【重要】
以前使用SimpleAdapter,它的侷限性在於,SimpleAdapter已經將內部的結構(即每一個item)封裝好了,而後按照這種格式疊加起來,沒法進行額外的處理。因此,這時候可使用BaseAdapter實現更靈活的列表。
(1)方法:實際上,就是本身寫一個MyAdapter類,讓它繼承BaseAdapter。須要複寫該類的四個方法:
最重要的是 getCount() 和 getView()。
(2)ListView 的優化:
完整版代碼以下:
activity_main.xml:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" > 10 <ListView 11 android:id="@+id/listView1" 12 android:layout_width="match_parent" 13 android:layout_height="match_parent" > 14 </ListView> 15 </LinearLayout>
注:爲了優化,第13行的代碼必定要寫match_parent,而不是wrap_content,解釋略。
activity_main_item.xml:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="wrap_content" 5 android:orientation="horizontal" 6 android:gravity="center" > 7 8 <ImageView 9 android:id="@+id/imageView1" 10 android:layout_width="81dp" 11 android:layout_height="81dp" 12 android:src="@drawable/vae" /> 13 <TextView 14 android:id="@+id/textView1" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:text="TextView" /> 18 </LinearLayout>
Mainactivity.java:
1 package com.smyhvae.smyh005listview4; 2 import android.app.Activity; 3 import android.os.Bundle; 4 import android.view.Menu; 5 import android.view.View; 6 import android.view.ViewGroup; 7 import android.widget.BaseAdapter; 8 import android.widget.ImageView; 9 import android.widget.ListView; 10 import android.widget.TextView; 11 public class MainActivity extends Activity { 12 private ListView listView; 13 @Override 14 protected void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.activity_main); 17 listView = (ListView) findViewById(R.id.listView1); 18 listView.setAdapter(new MyAdapter()); 19 } 20 // 定義的數據 21 private int[] images = { R.drawable.vae, R.drawable.vae, R.drawable.vae, 22 R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae, 23 R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae, 24 R.drawable.vae }; 25 private String[] names = { "生命01號", "生命02號", "生命03號", "生命04號", "生命05號", 26 "生命06號", "生命07號", "生命08號", "生命09號", "生命10號", "生命11號", "生命12號" }; 27 28 //自定義適配器 29 class MyAdapter extends BaseAdapter{ 30 @Override 31 public int getCount() { 32 // TODO Auto-generated method stub 33 return names.length; 34 } 35 @Override 36 public Object getItem(int position) { 37 // TODO Auto-generated method stub 38 return names[position]; 39 } 40 @Override 41 public long getItemId(int position) { 42 // TODO Auto-generated method stub 43 return position; 44 } 45 @Override 46 public View getView(int position, View convertView, ViewGroup parent) { 47 // TODO Auto-generated method stub 48 // System.out.println("position=" + position); 49 // System.out.println(convertView); 50 // System.out.println("------------------------"); 51 ViewHolder vh = new ViewHolder(); 52 //經過下面的條件判斷語句,來循環利用。若是convertView = null ,表示屏幕上沒有能夠被重複利用的對象。 53 if(convertView==null){ 54 //建立View 55 convertView = getLayoutInflater().inflate(R.layout.activity_main_item, null); 56 vh.iv = (ImageView) convertView.findViewById(R.id.imageView1); 57 vh.tv = (TextView) convertView.findViewById(R.id.textView1); 58 convertView.setTag(vh); 59 }else{ 60 vh = (ViewHolder)convertView.getTag(); 61 } 62 vh.iv.setImageResource(images[position]); 63 vh.tv.setText(names[position]); 64 return convertView; 65 } 66 67 } 68 69 static class ViewHolder{ 70 ImageView iv; 71 TextView tv; 72 } 73 @Override 74 public boolean onCreateOptionsMenu(Menu menu) { 75 // Inflate the menu; this adds items to the action bar if it is present. 76 getMenuInflater().inflate(R.menu.main, menu); 77 return true; 78 } 79 }
運行效果以下:
【工程文件】
連接:http://pan.baidu.com/s/1hqvImfM
密碼:oytm
5、ListView刷新分頁
這個過程說來話長,具體參考本人另一篇博客:
Android UI組件----自定義ListView實現動態刷新
想學習代碼以外的軟技能?不妨關注個人微信公衆號:生命團隊(id:vitateam)。
掃一掃,你將發現另外一個全新的世界,而這將是一場美麗的意外: