1.ListView
ListView 是 Android 系統為我們提供的一種串列顯示的一種控制元件,使用它可以用來顯示我們常見的串列形式,繼承自抽象類 AdapterView,繼承圖如下所示:

以微信好友串列為例:

里面的每個好友就是由一個個 item 組成的,而每個item都存在Adapter配接器類中(負責資料處理),然后通過ListView顯示出來.
2.ListView顯示原理
ListView顯示資料原理實際就是MVC設計模式,如下圖所示:

- Model(模型) – 資料集合,用來存盤資料組織
- View(視圖) – ListView,負責資料顯示
- Controller(控制器) - 負責管理Model,并設定要顯示的哪個具體資料.
3.使用BaseAdapter配接器
BaseAdapter比較簡單,主要是通過繼承此類來實作BaseAdapter的四個方法:
public int getCount(); //設定配接器中資料集的資料個數(ListView要顯示的所有資料行); public Object getItem(int position): //獲取資料集中與索引對應的資料項; public long getItemId(int position); //獲取指定行對應的ID,一般都是直接回傳position public View getView(int position,View convertView,ViewGroup parent); //獲取每一行Item的顯示內容, // position:表示當前獲取的Item是哪一行,開頭從0開始 // convertView:舊視圖復用,如果convertView不為空則表示可以用來復用.無需再次new一個view來使用. // ViewGroup:只有LinearLayout或者RelativeLayout,如果viewGroup傳入一個具體的物件,那么這個方法創建出來的view物件將作為這個viewGroup的childView來顯示.
示例效果如下所示:

3.1寫activity_main.xml
只是添加了一個ListView:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ListView android:id="@+id/lv_list" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > </ListView> </RelativeLayout>
4.2 寫item.xml
用來顯示每一項item的view視圖
<?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="match_parent" android:layout_margin="5dp" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView1" android:textSize="20sp" android:textColor="#000000" android:text="name" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/imageView1" android:layout_alignLeft="@+id/tv_name" android:text="content" android:textColor="#88000000" android:textSize="18sp" /> </RelativeLayout>
4.3 寫MainActivity.java
package com.example.baseadaptertest; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; class Person { String name; String content; public Person(String name,String content){ this.name = name; this.content = content; } public String getName() { return name; } public String getContent() { return content; } } public class MainActivity extends Activity { ArrayList<Person> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.添加要顯示的資料 list = new ArrayList<Person>(); list.add(new Person("張三","18歲 電話:158888666")); list.add(new Person("李四","21歲 電話:158888777")); list.add(new Person("王二","23歲 電話:158888877")); list.add(new Person("孫武","25歲 電話:158888997")); //2.設定Adapter ListView lv_list = (ListView)findViewById(R.id.lv_list); lv_list.setAdapter(new MyAdapter()); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; //如果convertView為空則需要重新創建資源視圖,如果不為空則表示可以用來復用.無需再次new一個view來使用. if(convertView==null){ //通過R.layout.item 來創建一個item視圖資源 view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null); }else{ view = convertView; } //設定要顯示的內容 TextView tv_name = (TextView)view.findViewById(R.id.tv_name); TextView tv_content = (TextView)view.findViewById(R.id.tv_content); tv_name.setText(list.get(position).getName()); tv_content.setText(list.get(position).getContent()); return view; } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
5.使用ArrayAdapter配接器
ArrayAdapter陣列配接器用于系結格式單一的資料,每個item只有一個資料需要被修改,資料源可以是集合或者陣列
并且ArrayAdapter可以直接用來使用,無需再繼承此類來實作.
ArrayAdapter的構造方法常用的有兩種:
public ArrayAdapter(Context context, int resource, T[] objects); //第一個引數 背景關系 //第二個引數 包含且只有一個textview的布局檔案id //第三個引數 要展示的資料陣列 public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects); //第一個引數 背景關系 //第二個引數 可以包含很多內容(ImageView、textview等)的布局檔案id //第三個引數 指向resource中要顯示資料的一個textView控制元件id //第三個引數 要展示的資料陣列
接下來,我們使用第二種構造方法來演示.
效果如下:

5.1 寫activity_main.xml
只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致
5.2 寫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/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="name" android:textColor="#AA000000" android:textSize="40sp" /> </LinearLayout>
5.3 寫MainActivity.java
package com.example.arrayadapter; import android.os.Bundle; import android.app.Activity; import android.view.Menu; 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); //定義一個String陣列 String[] objects = {"李白","姜子牙","李元芳","高漸離","后羿","王昭君","虞姬"}; //初始化ArrayAdapter ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects); //設定ArrayAdapter ListView lv_list = (ListView)findViewById(R.id.lv_list); lv_list.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
6.使用SimpleAdapter配接器
SimpleAdapter配接器適用于擁有多資料的item. 每個item通過Map集合來實作.而Map里則可以包含多個資料.
SimpleAdapter的構造方法如下所示:
public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to); //context: 背景關系,填入getApplicationContext()即可 //data:包含了Map(String ,Object)的List陣列,每個Map表示每個item資料, //resource:要加載item的xml布局檔案Id //from:string陣列, 用來標識一個item需要設定哪些key.而key對應的value則是要顯示的資料 //to:int陣列,填入item xml布局檔案里的要更改的控制元件內容ID號 ,用來對應from中的key值,表示設定的key值最終是更改哪些控制元件內容
效果如下:

6.1 寫activity_main.xml
只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致
6.2 寫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="match_parent" android:layout_margin="5dp" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="60dp" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/imageView1" android:textSize="17sp" android:textColor="#000000" android:text="name" /> <TextView android:id="@+id/tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/imageView1" android:layout_alignLeft="@+id/tv_title" android:layout_alignParentRight="true" android:layout_below="@+id/tv_title" android:text="content" android:textColor="#88000000" android:textSize="15sp" /> </RelativeLayout>
6.3 寫MainActivity.java
package com.example.simpleadapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.ListView; import android.widget.SimpleAdapter; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<Map<String, String>> data = https://www.cnblogs.com/lifexy/p/new ArrayList<Map<String,String>>(); String[] from = {"title","content"};//用來標識一個item需要設定哪些key.而key對應的value則是要顯示的資料,這里設定了2個key int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控制元件內容ID號 ,用來對應from中的兩個key值, //添加內容 Map<String, String> map1 = new HashMap<String, String>(); map1.put("title", "成都5.1級地震"); map1.put("content", "成都市青白江區5.1級地震尚無人員傷亡報告"); data.add(map1); Map<String, String> map2 = new HashMap<String, String>(); map2.put("title", "英雄聯盟手游即將上線"); map2.put("content", "期待已久的英雄聯盟即將上線..."); data.add(map2); Map<String, String> map3 = new HashMap<String, String>(); map3.put("title", "英語專四考試延期"); map3.put("content", "2020年英語專四專八考試延期..."); data.add(map3); Map<String, String> map4 = new HashMap<String, String>(); map4.put("title", "上海出臺減負政策"); map4.put("content", "上海發布抗疫企業減負政策 中小微企業:希望繼續加大..."); data.add(map4); Map<String, String> map5 = new HashMap<String, String>(); map5.put("title", "最硬核科蜜"); map5.put("content", "史上最硬核科蜜!穿著24號肩扛RPG佇立戰火中..."); data.add(map5); //初始化SimpleAdapter SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to); //設定SimpleAdapter ListView lv_list = (ListView)findViewById(R.id.lv_list); lv_list.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
Ps:如果要設定Item點擊事件,則通過下面方法設定即可
ListView lv_list = (ListView)findViewById(R.id.lv_list); lv_list.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //parent:被點擊的ListView //view:被點擊的條目物件 //postion:第幾個被點擊的條目索引 //id:通過getItemId()來獲取的id號(一般等于postion) System.out.println("第"+String.valueOf(position)+"個條目被點擊了!"); } });
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/34285.html
標籤:Android
