Android BaseAdapter適配器詳解用法
ListView和GridView
ListView,列表視圖,是Android中最重要的組件之一,幾乎每個Android應用中都會使用ListView。是一個以垂直方式在項目中顯示View視圖的列表。
GridView,網格試視圖
一、列數(shù)
android:numColumns=“3”
二、水平的距離
android:verticalSpacing=“10dp”
二、垂直的距離
android:horizontalSpacing=“10dp”
顯示與緩存機制
ListView、GridView等控件可以展示大量的數(shù)據(jù)信息。如果ListView有100條信息,但是屏幕的尺寸是有限的,一屏幕只能顯示下圖中的10條。當向上滑動ListView的時候,條目1被滑出了屏幕區(qū)域,那么系統(tǒng)就會將條目2回收到Recycler中,即View緩沖池中,而將要顯示的條目11則會從緩存池中取出布局文件,并重新設置好條目11需要顯示的數(shù)據(jù),并放入需要顯示的位置。這就是ListView的緩沖機制,需要時才顯示,顯示完就被會收到緩存。
BaseAdapter
BaseAdapter是一種Adapter,在Android中,Adapter為適配器,可以構建數(shù)據(jù)源與視圖展示的橋梁,從而讓數(shù)據(jù)源與視圖展示相互關聯(lián),同時又解除耦合。
繼承此類來實現(xiàn)BaseAdapter的四個方法:
public int getCount(): 適配器中數(shù)據(jù)集的數(shù)據(jù)個數(shù); public Object getItem(int position): 獲取數(shù)據(jù)集中與索引對應的數(shù)據(jù)項; public long getItemId(int position): 獲取指定行對應的ID; public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。
使用演示
實現(xiàn)簡單的微信主頁面
布局
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>
創(chuàng)建數(shù)據(jù)源
JavaBean存放數(shù)據(jù)
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;
}
}
初始化數(shù)據(jù)源
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;
}
});
創(chuàng)建BaseAdapter及設置緩存
一般采用內部類的形式進行適配器的自定義
緩存方式
創(chuàng)建ViewHolder類,創(chuàng)建布局映射關系;
判斷convertView,為空則創(chuàng)建,并設置tag,不為空則通過tag取出ViewHolder;
給ViewHolder的控件設置數(shù)據(jù)
class MyAdapter extends BaseAdapter {
@Override
//ListView需要顯示的數(shù)據(jù)數(shù)量
public int getCount() {
return list.size();
}
@Override
//指定的索引對應的數(shù)據(jù)項
public Object getItem(int position) {
return list.get(position);
}
@Override
//指定的索引對應的數(shù)據(jù)項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關聯(lián)
} else {
//如果緩存池中有對應的view緩存,則直接通過getTag取出viewHolder
viewHolder = (ViewHolder)convertView.getTag();
}
// 取出bean對象
ItemBean itemBean = list.get(position);
// 設置控件的數(shù)據(jù)
viewHolder.tvName.setText(itemBean.getUserName());
viewHolder.tvMsg.setText(itemBean.getMsg());
viewHolder.imgAvatar.setImageResource(itemBean.getImgId());
return convertView;
}
//用于緩存
class ViewHolder{
//修改的組件
TextView tvName,tvMsg;
ImageView imgAvatar;
}
}
設置適配器
//創(chuàng)建適配器對象
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() {
//初始化數(shù)據(jù)
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]));
}
//創(chuàng)建適配器對象
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需要顯示的數(shù)據(jù)數(shù)量
public int getCount() {
return list.size();
}
@Override
//指定的索引對應的數(shù)據(jù)項
public Object getItem(int position) {
return list.get(position);
}
@Override
//指定的索引對應的數(shù)據(jù)項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關聯(lián)
} else {
//如果緩存池中有對應的view緩存,則直接通過getTag取出viewHolder
viewHolder = (ViewHolder)convertView.getTag();
}
// 取出bean對象
ItemBean itemBean = list.get(position);
// 設置控件的數(shù)據(jù)
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內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android中Retrofit+OkHttp進行HTTP網絡編程的使用指南
Retrofit和OkHttp都是Square在GitHub上開源的第三方HTTP支持包,兩個包可以搭配使用,本文即是來講解Android中Retrofit+OkHttp進行HTTP網絡編程的使用指南:2016-07-07
Android itemDecoration接口實現(xiàn)吸頂懸浮標題
這篇文章主要介紹了Android中使用itemdecoration實現(xiàn)吸頂懸浮標題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-11-11
調用startService會拋出IllegalStateException異常解決
這篇文章主要為大家介紹了調用startService會拋出IllegalStateException異常解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07

