Android BaseAdapter適配器詳解用法
ListView和GridView
ListView,列表視圖,是Android中最重要的組件之一,幾乎每個Android應用中都會使用ListView。是一個以垂直方式在項目中顯示View視圖的列表。
GridView,網格試視圖
一、列數
android:numColumns=“3”
二、水平的距離
android:verticalSpacing=“10dp”
二、垂直的距離
android:horizontalSpacing=“10dp”
顯示與緩存機制
ListView、GridView等控件可以展示大量的數據信息。如果ListView有100條信息,但是屏幕的尺寸是有限的,一屏幕隻能顯示下圖中的10條。當向上滑動ListView的時候,條目1被滑出瞭屏幕區域,那麼系統就會將條目2回收到Recycler中,即View緩沖池中,而將要顯示的條目11則會從緩存池中取出佈局文件,並重新設置好條目11需要顯示的數據,並放入需要顯示的位置。這就是ListView的緩沖機制,需要時才顯示,顯示完就被會收到緩存。
BaseAdapter
BaseAdapter是一種Adapter,在Android中,Adapter為適配器,可以構建數據源與視圖展示的橋梁,從而讓數據源與視圖展示相互關聯,同時又解除耦合。
繼承此類來實現BaseAdapter的四個方法:
public int getCount(): 適配器中數據集的數據個數; public Object getItem(int position): 獲取數據集中與索引對應的數據項; public long getItemId(int position): 獲取指定行對應的ID; public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。
使用演示
實現簡單的微信主頁面
佈局
ListView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" tools:context="com.qingsu.weixin.WeiXinStart" android:orientation="vertical" > <Toolbar android:layout_width="match_parent" android:layout_height="40dp" > <ImageView android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="right" android:layout_marginRight="15dp" android:background="@mipmap/jia" /> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_marginRight="15dp" android:layout_gravity="right" android:background="@mipmap/chaxun" /> <TextView android:layout_width="match_parent" android:layout_height="24dp" android:layout_marginLeft="50dp" android:gravity="center" android:text="微信(999)" android:textSize="16sp" android:textColor="#000" /> </Toolbar> <ListView android:id="@+id/lsViewWeiXin" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
所加條目
<?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" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginLeft="10dp" android:orientation="horizontal" > <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:gravity="center" > <ImageView android:id="@+id/imgAvatar" android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@mipmap/touxiang0" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="4" android:orientation="vertical" android:gravity="center_vertical" > <TextView android:id="@+id/tvUserName" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="這是網名" android:textColor="#000" android:textSize="14sp" /> <TextView android:id="@+id/tvMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="3dp" android:text="最初的消息" android:textSize="10sp" /> </LinearLayout> </LinearLayout> </LinearLayout> </LinearLayout>
創建數據源
JavaBean存放數據
public class ItemBean { private String userName; private String Msg; private int imgId; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getMsg() { return Msg; } public void setMsg(String msg) { Msg = msg; } public int getImgId() { return imgId; } public void setImgId(int imgId) { this.imgId = imgId; } public ItemBean(String userName, String msg, int imgId) { this.userName = userName; Msg = msg; this.imgId = imgId; } }
初始化數據源
ArrayList<ItemBean> list = new ArrayList<ItemBean>(); ListView listView = findViewById(R.id.lsViewWeiXin); int[] imageNmae = {R.mipmap.touxiang0, R.mipmap.touxiang1, R.mipmap.touxiang2, R.mipmap.touxiang3, R.mipmap.touxiang4, R.mipmap.touxiang5, R.mipmap.touxiang6, R.mipmap.touxiang7, R.mipmap.touxiang8, R.mipmap.touxiang9, R.mipmap.touxiang10, R.mipmap.touxiang11, R.mipmap.touxiang12, R.mipmap.touxiang13, R.mipmap.touxiang14, R.mipmap.touxiang15, R.mipmap.touxiang16, R.mipmap.touxiang17, R.mipmap.touxiang18, R.mipmap.touxiang19, }; for (int i = 0; i < 19; i++) { String userName = "微信好友" + i; String userMsg = "這是一條很長很長很長的語音消息建議您刪除好友" + i; list.add(new ItemBean(userName, userMsg, imageNmae[i])); }
設置條目的單機和長按事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(WeiXinStart.this, "第" + position + "個條目被點擊瞭", Toast.LENGTH_SHORT).show(); } }); listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(WeiXinStart.this, "第" + position + "個條目被點長按瞭", Toast.LENGTH_SHORT).show(); return false; } });
創建BaseAdapter及設置緩存
一般采用內部類的形式進行適配器的自定義
緩存方式
創建ViewHolder類,創建佈局映射關系;
判斷convertView,為空則創建,並設置tag,不為空則通過tag取出ViewHolder;
給ViewHolder的控件設置數據
class MyAdapter extends BaseAdapter { @Override //ListView需要顯示的數據數量 public int getCount() { return list.size(); } @Override //指定的索引對應的數據項 public Object getItem(int position) { return list.get(position); } @Override //指定的索引對應的數據項ID public long getItemId(int position) { return position; } @Override //返回每一項的顯示內容 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = new ViewHolder(); //如果view未被實例化過,緩存池中沒有對應的緩存 if(convertView == null){ //進行地址初始化 convertView = LayoutInflater.from(WeiXinStart.this).inflate(R.layout.itemweixin_list,null); viewHolder.tvName = convertView.findViewById(R.id.tvUserName); viewHolder.tvMsg = convertView.findViewById(R.id.tvMsg); viewHolder.imgAvatar = convertView.findViewById(R.id.imgAvatar); convertView.setTag(viewHolder);//通過setTag將convertView與viewHolder關聯 } else { //如果緩存池中有對應的view緩存,則直接通過getTag取出viewHolder viewHolder = (ViewHolder)convertView.getTag(); } // 取出bean對象 ItemBean itemBean = list.get(position); // 設置控件的數據 viewHolder.tvName.setText(itemBean.getUserName()); viewHolder.tvMsg.setText(itemBean.getMsg()); viewHolder.imgAvatar.setImageResource(itemBean.getImgId()); return convertView; } //用於緩存 class ViewHolder{ //修改的組件 TextView tvName,tvMsg; ImageView imgAvatar; } }
設置適配器
//創建適配器對象 MyAdapter myAdapter = new MyAdapter(); //設置適配器 listView.setAdapter(myAdapter);
完整主代碼
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.qingsu.bean.ItemBean; import com.qingsu.yingguday05.R; import java.util.ArrayList; public class WeiXinStart extends AppCompatActivity { ListView listView; ArrayList<ItemBean> list = new ArrayList<ItemBean>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_wei_xin_start); myBaseAdapter(); } public void myBaseAdapter() { //初始化數據 listView = findViewById(R.id.lsViewWeiXin); int[] imageNmae = {R.mipmap.touxiang0, R.mipmap.touxiang1, R.mipmap.touxiang2, R.mipmap.touxiang3, R.mipmap.touxiang4, R.mipmap.touxiang5, R.mipmap.touxiang6, R.mipmap.touxiang7, R.mipmap.touxiang8, R.mipmap.touxiang9, R.mipmap.touxiang10, R.mipmap.touxiang11, R.mipmap.touxiang12, R.mipmap.touxiang13, R.mipmap.touxiang14, R.mipmap.touxiang15, R.mipmap.touxiang16, R.mipmap.touxiang17, R.mipmap.touxiang18, R.mipmap.touxiang19, }; for (int i = 0; i < 19; i++) { String userName = "微信好友" + i; String userMsg = "這是一條很長很長很長的語音消息建議您刪除好友" + i; list.add(new ItemBean(userName, userMsg, imageNmae[i])); } //創建適配器對象 MyAdapter myAdapter = new MyAdapter(); listView.setAdapter(myAdapter); //單機事件 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(WeiXinStart.this, "第" + position + "個條目被點擊瞭", Toast.LENGTH_SHORT).show(); } }); //長按事件 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(WeiXinStart.this, "第" + position + "個條目被點長按瞭", Toast.LENGTH_SHORT).show(); return false; } }); } class MyAdapter extends BaseAdapter { @Override //ListView需要顯示的數據數量 public int getCount() { return list.size(); } @Override //指定的索引對應的數據項 public Object getItem(int position) { return list.get(position); } @Override //指定的索引對應的數據項ID public long getItemId(int position) { return position; } @Override //返回每一項的顯示內容 public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = new ViewHolder(); //如果view未被實例化過,緩存池中沒有對應的緩存 if(convertView == null){ //進行地址初始化 convertView = LayoutInflater.from(WeiXinStart.this).inflate(R.layout.itemweixin_list,null); viewHolder.tvName = convertView.findViewById(R.id.tvUserName); viewHolder.tvMsg = convertView.findViewById(R.id.tvMsg); viewHolder.imgAvatar = convertView.findViewById(R.id.imgAvatar); convertView.setTag(viewHolder);//通過setTag將convertView與viewHolder關聯 } else { //如果緩存池中有對應的view緩存,則直接通過getTag取出viewHolder viewHolder = (ViewHolder)convertView.getTag(); } // 取出bean對象 ItemBean itemBean = list.get(position); // 設置控件的數據 viewHolder.tvName.setText(itemBean.getUserName()); viewHolder.tvMsg.setText(itemBean.getMsg()); viewHolder.imgAvatar.setImageResource(itemBean.getImgId()); return convertView; } //用於緩存 class ViewHolder{ //修改的組件 TextView tvName,tvMsg; ImageView imgAvatar; } } }
演示
到此這篇關於Android BaseAdapter適配器詳解用法的文章就介紹到這瞭,更多相關Android BaseAdapter內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- GridView實現桌面圖標顯示案例
- Android ListView仿微信聊天界面
- Android入門之實現自定義可復用的BaseAdapter
- Android入門教程之ListView的具體使用詳解
- Android Gridview佈局出現滾動條或組件沖突解決方法