Android BaseAdapter适配器详解用法
作者:青素i 发布时间:2022-07-09 03:59:52
标签: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;
}
}
}
演示
来源:https://blog.csdn.net/Carryi/article/details/120613396
0
投稿
猜你喜欢
- 在spring 3.2 及以后版本中增加了对请求的异步处理,旨在提高请求的处理速度降低服务性能消耗。在我们的请求中做了耗时处理,当并发请求的
- 如何将ResultSet结果集遍历到List中今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页
- Android 工程构建的持续集成,需要搭建一套编译和打包自动化流程,比如建立每日构建系统、自动生成发布文件等等。这些都需要我们对Andro
- 一、MessageBox弹出框MessageBox.Show(<字符串> Text, <字符串> Title, &l
- 前不久看到鸿洋大大的圆形菜单,就想开始模仿,因为实在是太酷了,然后自己根据别人(zw哥)给我讲的一些思路、一些分析,就开始改造自己的圆形菜单
- 本文实例讲述了C#分布式事务的超时处理的方法。分享给大家供大家参考。具体分析如下:事务是个很精妙的存在,我们在数据层、服务层、业务逻辑层等多
- Word中设置水印时,可加载图片设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水
- 程序入口:Test_Email_N.javaimport java.io.IOException;import java.util.Date
- 前端向后端传递参数,后端怎么去接收,就会想到 spring 的注解之前的话,我一直用的是 RequestParam("userNa
- 提到Java发送HTTP请求,大家首先想到的是用apache的HttpClient,或者squareup的OkHttp。而在Java11之前
- 一般来说课本上的数据结构包括数组、单链表、堆栈、树、图。我这里所指的数据结构,是一个怎么表示一个对象的问题,有时候,单单一个变量声明不堪大用
- 1.EazyEmail邮件发送类库Net 类库自带了邮件发送功能。笔者对该类库,从使用的角度进行了二次封装,nuget上可搜索EazyEma
- 大家是不是平常都有好多文件需要定期备份?如歌曲、视频、文档,代码文件等等,如果经常增加删除修改文件,就需要定期备份,最早之前文件都不大的时候
- 1,USB存储设备(如:U盘,移动硬盘): //USB存储设备 插拔监听与 SD卡插拔监听一致。 private USB
- 这篇文章主要介绍了SpringBoot项目的测试类实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 1.android中利用webview调用网页上的js代码。Android 中可以通过webview来实现和js的交互,在程序中调用js代码
- 多线程的好处是不言而喻的,它能帮我们刚更多的事情,同时干不同的事情在程序设计中是经常出现的,这种时候我们使用的是线程。在Kotlin 中,
- 1基本输入输出 static void main(string[] args) { cons
- 概述@SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解。基本用法如下:1. 添加Maven
- 因为目前所用mybatis-plus版本为3.1.1,感觉是个半成品,所有在实体类上的注解只能支持单表,没有一对一和一对多关系映射,且该功能