【android】ListView之BaseAdapter使用详解

Delphine ·
更新时间:2024-09-20
· 857 次阅读

android中ListView是一个比较常用的控件,它用于方便的列表显示可见数据,当数据过多时,会出现滚动条,并且可以根据屏幕长度进行自适应显示。

1. 为什么使用BaseAdapter?

ListView需要设置数据适配,就是添加你需要显示的内容,所谓适配就是数据与视图之间的桥梁;
而ListView有几种适配器:

BaseAdapter:顾名思义,最基础的适配器,有四个抽象方法,可以方便的根据需求做出更改 ArrayAdapter:继承BaseAdapter,实现了四个抽象方法,多用于只有文本的列表 SimpleAdapter:继承BaseAdapter,实现了四个抽象方法,可以简单的实现列表样式(无法轮播)

每种适配器都有它的适用范围,但BaseAdapter是铁板钉钉的通用适配器,只不过需要自己去实现四个抽象方法。

2. 如何使用BaseAdapter? 2.1 介绍四个抽象函数的用处

getCount():重要函数,返回多少就有多少个Item。

public int getCount() {//返回 ListView Item 条目的总数 return 100; //如果返回100,那就会有100个item;一般返回List.size() }

getView(int position, View convertView, ViewGroup parent):重要函数,返回的是当前Item的视图。
三个参数:当前Item的下标,当前视图(可复用),当前视图的父视图(可调整当前视图的宽高)

public View getView(int position, View convertView, ViewGroup parent) { return convertView;//返回的是每个Item的视图 }

getItem(int position):不重要函数,返回的是当前Item的数据对象。
一个参数:当前Item的下标

public Object getItem(int position) {//返回ListView Item条目代表的数据对象 return list.get(position); }

getItemId(int position):不重要函数,返回的是当前Item的下标。
一个参数:当前Item的下标

public long getItemId(int position) {//返回ListView Item的下标 return position; } 2.2 具体实现一个小例子:轮播ListView

咱们图片不够,就用轮播来凑,总共7张图片,无限轮播
图片下载连接:图片

2.2.1 首先是布局

主布局:activity_main.xml

Item布局:list_item.xml

2.2.2 其次是Activity

MainActivity
list的数据要和App实体类一致哦

import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView lv; private List list;//数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv=findViewById(R.id.lv); //list数据 list=new ArrayList(); list.add(new App("京东商城",R.drawable.jd)); list.add(new App("QQ",R.drawable.qq)); list.add(new App("QQ斗地主",R.drawable.dz)); list.add(new App("新浪微博",R.drawable.xl)); list.add(new App("天猫",R.drawable.tm)); list.add(new App("UC浏览器",R.drawable.uc)); list.add(new App("微信",R.drawable.wx)); //MyBaseAdapter适配器 MyBaseAdapter myBaseAdapter=new MyBaseAdapter(this,list); lv.setAdapter(myBaseAdapter); } } 2.2.3 然后是实体类App(名字自拟)

这个实体类两个属性:一个是Item显示的文本,一个是Item显示的图片id

//App实体类 public class App { private String name; private int id; public App(String name, int id) { this.name = name; this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } } 2.2.4 最后是适配器MyBaseAdapter(名字自拟,继承BaseAdapter ,重点)

MyBaseAdapter的构造函数要传入上下文和需要显示的数据的集合;
getView中的代码写法是为了复用Item对象,避免每一个Item都是新的对象导致内存爆满;
具体详解请看代码注释

import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; public class MyBaseAdapter extends BaseAdapter { private LayoutInflater layoutInflater;//得到一个LayoutInfalter对象用来导入布局 private List list;//得到一个List集合用来导入数据 //构造函数 public MyBaseAdapter(Context context, List list) { this.layoutInflater =LayoutInflater.from(context); this.list = list; } @Override //return 多少就有个多少个item列表 public int getCount() {//返回ListView Item条目的总数 return 100; } @Override public Object getItem(int position) {//返回ListView Item条目代表的对象 return list.get(position); } @Override public long getItemId(int position) {//返回ListView Item的id return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { //绑定Item布局 convertView = layoutInflater.inflate(R.layout.list_item, null, false); //自定义内部类,对象holder用来存储文字和图片控件 holder = new ViewHolder(); holder.mTextView = (TextView) convertView.findViewById(R.id.item_tv); holder.imageView = (ImageView) convertView.findViewById(R.id.item_image); //将holder放入当前视图中 convertView.setTag(holder); } else { //复用holder holder = (ViewHolder) convertView.getTag(); } //取出app对象 App app=list.get(position % 7);//此处%7就可以无限轮播 holder.mTextView.setText(app.getName()); holder.imageView.setBackgroundResource(app.getId()); Log.v("hc", "getView结束:position=" + position + ",name=" + app.getName() + ",convertView=" + convertView );//可以通过hc标签查看logcat return convertView; } //内部类 class ViewHolder { TextView mTextView; ImageView imageView; } } 2.2.5 执行结果

模拟器
手机运行程序
用好BaseAdapter,所有的类似这种列表都能实现
而ArrayAdapter和SimpleAdapter是基于BaseAdapter的简化版本,这里不再解说。

如果本文章对您有所帮助,请点个赞支持一下作者~


作者:此成非彼诚



baseadapter listview Android

需要 登录 后方可回复, 如果你还没有账号请 注册新账号