Android studio 之 适配器

  • ListView仅作为容器(列表),用于装载 & 显示数据(即 列表项Item
  • 而容器内的具体数据(列表项Item)则是由 适配器(Adapter)提供

适配器(Adapter):作为View 和 数据之间的桥梁 & 中介,将数据映射到要展示的View

  • 当需显示数据时,ListView会向Adapter取出数据,从而加载显示,具体如下图

数组适配器 ArrayAdapter

适用于列表项只含有文本信息的情况

将数组适配器绑定在对话框上

1.创建一个按钮,并添加点击事件,打开添加了适配器的对话框

<Buttonandroid:id="@+id/adpter_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:onClick="popAlert"android:text="数组适配器 ArrayAdapter" />

2.创建数组适配器

创建数据源

final String[] items= {"java","c++","android","flutter","dart"};

创建适配器中的每一项数据的样式布局

<!-- 适配器中每一项数据的样式布局 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:gravity="center_vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><ImageViewandroid:layout_width="40dp"android:layout_height="40dp"android:src="@mipmap/star"/><TextViewandroid:id="@+id/arry_tx"android:text="测试"android:layout_marginLeft="15dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>

实例化一个数组适配器

  • 参数1 Context:环境上下文
  • 参数2 resource:布局资源索引
  • 参数3 int textViewResourceId:指定数据中文本需要放在布局中的文本控件的id
  • 参数4 objects:数据源
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.array_item_layout,R.id.arry_tx,items);

3.在对话框里添加适配器  .setAdapter()

  • 参数1 - ListAdapter 适配器对象(对数据显示样式的规则制定器):The ListAdapter to supply the list of items
  • 参数2 - OnClickListener 监听器 (可给可不给,不给则设为null)
// 实例化对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
ArrayAdapter arrayAdapter = new ArrayAdapter(this, R.layout.array_item_layout,R.id.arry_tx,items);builder.setTitle("请选择")/* .setAdapter() 设置适配器* 参数1 - ListAdapter 适配器对象(对数据显示样式的规则制定器):The ListAdapter to supply the list of items* 参数2 - OnClickListener 监听器 (可给可不给,不给则设为null)*/.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {@Override/*int which 当前点击的item索引*/public void onClick(DialogInterface dialog, int which) {Toast.makeText(ButtonActivity.this,items[which],Toast.LENGTH_SHORT).show();}}).show();

简单适配器  SimpleAdapter

即可以处理列表项全是文本的情况,又可以处理列表项包含其他控件(如图片、文本、按钮等)情况

使用步骤

  • 准备数据源

private void initData() {Map<String,Object> data1 = new HashMap<>();data1.put("icon",R.mipmap.star);data1.put("name","沈成林");data1.put("age",23);Map<String,Object> data2 = new HashMap<>();data2.put("icon",R.mipmap.star);data2.put("name","杨滨溶");data2.put("age",23);Map<String,Object> data3 = new HashMap<>();data3.put("icon",R.mipmap.star);data3.put("name","朱一龙");data3.put("age",23);data.add(data1);data.add(data2);data.add(data3);}
  • 准备布局(适配器每一项数据的显示样式布局)

R.layout.simpleadapeter_item:

<?xml version="1.0" encoding="utf-8"?>
<!-- SimpleAdapter 的item样式-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><ImageViewandroid:id="@+id/headIcon"android:layout_width="50dp"android:layout_height="65dp"android:background="@mipmap/study" /><TextViewandroid:id="@+id/itemName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="28dp"android:layout_toEndOf="@+id/headIcon"android:text="name"android:textSize="26sp" /><TextViewandroid:id="@+id/itemAge"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/itemName"android:layout_marginLeft="30dp"android:layout_marginTop="13dp"android:layout_toRightOf="@id/headIcon"android:text="TextView"android:textColor="#F44336"android:textStyle="bold" /></RelativeLayout>
  • 实例化一个简单适配器 

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, @LayoutRes int resource, String[] from, @IdRes int[] to)
参数1:环境上下文
参数2:数据源
参数3:每一项布局(列表项布局)  R.layout.simpleadapeter_item
参数4:数据来源的key数组,一个String数据,对应到Map上的每个<key,value>的key值
参数5:是一个int数组,对应resource列表项布局文件里面每个控件的id,需要与上面String[] from的from相对应
key所指代的数据会在to数组中id所代表的控件上显示出来
String[] from = {"icon","name","age"}; // 参数4
int[] to = {R.id.headIcon,R.id.itemName,R.id.itemAge}; // 参数5
SimpleAdapter simpleAdapter = new SimpleAdapter(this,data,R.layout.simpleadapeter_item,from,to);

通过ListView来展示

1.添加ListView控件,xml文件

 <LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="4"><ListViewandroid:id="@+id/list1"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

2.将ListView控件绑定在 SimpleAdapter 上

ListView listView = findViewById(R.id.list1);
listView.setAdapter(simpleAdapter);

3.为listView设置item点击事件

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {/*数据源data是一个List<Map<String,Object>>的列表,*onItemClick方法,返回的position就是当前点击的 item 的位序,通过它可以拿到item的数据源*view 就是点击的item的视图*/Map<String,Object> data1 = data.get(position);Toast.makeText(ListViewActivity.this,"姓名"+data1.get("name")+",年龄:"+data1.get("age"),Toast.LENGTH_SHORT).show();}});

基本适配器 BaseAdapter

根据xml文件中定义的样式进行列表项的填充,完全自定义数据适配方式,适用性最强

准备列表项布局 R.layout.baseadapter_item

<?xml version="1.0" encoding="utf-8"?>
<!-- 1. BaseAdapter item的样式设计-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/base_icon"android:src="@mipmap/study"android:layout_width="80dp"android:layout_margin="5dp"android:layout_height="80dp"/><TextViewandroid:id="@+id/base_name"android:layout_width="match_parent"android:layout_height="40dp"android:text="nickName"android:layout_toRightOf="@+id/base_icon"android:layout_margin="5dp"android:textSize="26sp" /><TextViewandroid:id="@+id/base_time"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dp"android:layout_alignStart="@+id/base_name"android:layout_toRightOf="@+id/base_icon"android:layout_below="@+id/base_name"android:textSize="22sp"android:text="2023-12-4" /><TextViewandroid:id="@+id/base_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/base_icon"android:textSize="26sp"android:text="这是内容" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/base_content"android:layout_marginTop="20dp"android:orientation="horizontal"><ImageViewandroid:id="@+id/base_icon1"android:layout_width="40dp"android:layout_height="50dp"android:layout_weight="1"android:src="@mipmap/star" /><ImageViewandroid:id="@+id/base_icon2"android:layout_width="40dp"android:layout_height="50dp"android:layout_weight="1"android:src="@mipmap/star" /><ImageViewandroid:id="@+id/base_icon3"android:layout_width="40dp"android:layout_height="50dp"android:layout_weight="1"android:src="@mipmap/star" /></LinearLayout></RelativeLayout>

准备数据源

准备一个数据对象 BaseMsg类

package com.example.androidstudiostudy.data;// 2.1 准备数据源 - BaseAdapter 的数据源类
public class BaseMsg {private int icon;private String nickName;private String content;public int getIcon() {return icon;}public void setIcon(int icon) {this.icon = icon;}public String getNickName() {return nickName;}public void setNickName(String nickName) {this.nickName = nickName;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public boolean isLike() {return isLike;}public void setLike(boolean like) {isLike = like;}private boolean isLike;public BaseMsg(int icon, String nickName, String content, boolean isLike) {this.icon = icon;this.nickName = nickName;this.content = content;this.isLike = isLike;}
}

初始化一个 BaseMsg 列表

private List<BaseMsg> lists = new ArrayList<>();  // 定义一个 BaseMsg 对象的列表
private int[] touxiang ={R.mipmap.star,R.mipmap.study,R.mipmap.star,R.mipmap.study,R.mipmap.star,R.mipmap.study,R.mipmap.star,R.mipmap.study,}; // 定义一个int类型的数组,里面存放 图标的id// 初始化 BaseMsg 对象的列表
public void initBaseListData() {for (int i = 0; i < 8; i++) {BaseMsg baseMsg = new BaseMsg(touxiang[i], "用户" + (i+1), "这是第" + (i+1) + "段代码", false);lists.add(baseMsg);}}

构建  BaseAdapter 适配器 

新建一个继承自 BaseAdapter 的类,在这个类中对每一个item的布局进行设计
要求传入 环境上下文、数据源

package com.example.androidstudiostudy;import android.content.Context;
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 android.widget.Toast;import com.example.androidstudiostudy.data.BaseMsg;
import java.util.List;// 新建一个继承自 BaseAdapter 的类
// 根据准备好的数据源和子项布局完成 ListView 效果的一一设置
public class MyBaseAdapter extends BaseAdapter {private List<BaseMsg> baseMsgList;private Context context;// 构造方法public MyBaseAdapter(List<BaseMsg> baseMsgList,Context context) {this.baseMsgList = baseMsgList;this.context = context;}// 获取数量(设置listView的长度)@Overridepublic int getCount() {return baseMsgList.size();}@Override// 获取视图(设置 listView 每一项的显示效果)/* 参数1:当前Item的下标 --- 和数据源的下标相同,可以由此获取数据源配置item* 参数2:当前Item的view* 参数3:当前视图的父视图(可调整当前视图的宽高)*/public View getView(int position, View convertView, ViewGroup parent) {// 完成对view的设置// 将设置好的 item 布局资源转换成viewconvertView = LayoutInflater.from(context).inflate(R.layout.baseadapter_item,null); // 此时得到的是最初的item布局,没有添加的数据// 获取数据源[position] 的数据,并将他们设置到item视图中的控件中BaseMsg m = baseMsgList.get(position); // 获取item的数据列表ImageView imageView = convertView.findViewById(R.id.base_icon);imageView.setImageResource(m.getIcon());TextView tN = convertView.findViewById(R.id.base_name);tN.setText(m.getNickName());TextView tC = convertView.findViewById(R.id.base_content);tC.setText(m.getContent());// 可以给item的单个控件设置点击事件tN.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//  System.out.printf("点击了"+tN.getText());Toast.makeText(context,"你点击了"+m.getNickName(),Toast.LENGTH_SHORT).show();}});return convertView;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}}
 // 获取视图(设置 listView 每一项的显示效果)/* 参数1:当前Item的下标 --- 和数据源的下标相同,可以由此获取数据源配置item* 参数2:当前Item的view* 参数3:当前视图的父视图(可调整当前视图的宽高)*/
public View getView(int position, View convertView, ViewGroup parent)

实例化 BaseAdapter 适配器

BaseAdapter baseAdapter = new MyBaseAdapter(lists,this);

通过ListView展示

initBaseListData();
listView.setAdapter(baseAdapter);

动态添加

// 动态添加 BaseAdapter 数据源中的数据
public void addData(View view) {lists.add(new BaseMsg(R.mipmap.ic_launcher,"新name","这是新增的",false));// 通知适配器更新baseAdapter.notifyDataSetChanged();// 设置listView自动显示到最新的数据listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
}

列表自动滑动到底部  :TRANSCRIPT_MODE_ALWAYS_SCROLL

    /*** The list will automatically scroll to the bottom, no matter what items* are currently visible.** @see #setTranscriptMode(int)*/
// 列表自动滑动到底部public static final int TRANSCRIPT_MODE_ALWAYS_SCROLL = 2;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/640240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《WebKit 技术内幕》学习之八(3):硬件加速机制

3 其他硬件加速模块 3.1 2D图形的硬件加速机制 其实网页中有很多绘图操作是针对2D图形的&#xff0c;这些操作包括通常的网页绘制&#xff0c;例如绘制边框、文字、图片、填充等&#xff0c;它们都是典型的2D绘图操作。在HTML5中&#xff0c;规范又引入了2D绘图的画布功能&a…

YARN节点故障的容错方案

YARN节点故障的容错方案 1. RM高可用1.1 选主和HA切换逻辑 2. NM高可用2.1 感知NM节点异常2.2 异常NM上的任务处理 4. 疑问和思考4,1 RM感知NM异常需要10min&#xff0c;对于app来说是否太长了&#xff1f; 5. 参考文档 本文主要探讨yarn集群的高可用容错方案和容错能力的探讨。…

【复现】D-Tale SSRF漏洞(CVE-2024-21642)_26

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 D-Tale数据可视化插件是后端框架Flask与前端框架React组合产生的一款开源的数据可视化分析插件。 目前支持DataFrame、Series、Mu…

深入理解C语言(2):字符、字符串与内存函数

文章主题&#xff1a;字符、字符串与内存函数&#x1f30f;所属专栏&#xff1a;深入理解C语言&#x1f4d4;作者简介&#xff1a;更新有关深入理解C语言知识的博主一枚&#xff0c;记录分享自己对C语言的深入解读。&#x1f606;个人主页&#xff1a;[₽]的个人主页&#x1f3…

简单屏蔽WPforms垃圾留言和无效询盘的方法

简单屏蔽WPforms垃圾留言和无效询盘的方法 发表评论 因为WPforms的可视化操作非常简单&#xff0c;不少外贸网站都使用WPforms来制作询盘表单&#xff0c;而只要网站可以提交留言&#xff0c;就非常容易被垃圾留言骚扰。本文奶爸将给大家介绍两种屏蔽WPforms表单垃圾留言的方…

单片机中MCU跑RTOS相比裸机的优势

经常有读者问关于RTOS的问题&#xff0c;比如&#xff1a;我现在要不要学习RTOS&#xff1f; 学习RTOS有什么好处&#xff1f; 我的项目要不要跑RTOS&#xff1f; 问这些问题&#xff0c;其实归根结底还是对RTOS理解的不够&#xff0c;项目开发的经验还不足等。针对这部分朋友…

实战项目(一)内容管理系统

一、实现技术 前端技术&#xff1a;html、javascript(jquery、ajax、json)、css 后端技术&#xff1a;java、mysql、servlet 开发工具&#xff1a;eclipse、vscode 二、项目描述 首页仿写某大学网页&#xff0c;上面有各种栏目及栏目内容&#xff0c;管理员能登录进去对首…

FPGA之分布式RAM(2)

1) 128 X1 Single Port Distributed RAM 下图中可以看出来,通过2个LUT的组合使用可以串联实现更大深度的分布式RAM.下图中出现了F7BMUX的加入, F7BMUX可以用于LUT输出的选通. 原语调用&#xff1a; RAM128XIS#(INIT(128h00000000000000000000000000000000) // Initial conten…

2.服务拆分和远程调用

2.服务拆分和远程调用 任何分布式架构都离不开服务的拆分&#xff0c;微服务也是一样。 2.1.服务拆分原则 这里我总结了微服务拆分时的几个原则&#xff1a; 不同微服务&#xff0c;不要重复开发相同业务微服务数据独立&#xff0c;不要访问其它微服务的数据库微服务可以将…

接口测试详解,看完就会。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试&#xff1f; 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递…

力扣移掉k位数字402

Problem: 402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 &#xff1a; 给你一个以字符串表示的非负整数 num 和一个整数 k &…

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

怎么抹掉 Macbook系统 并将它还原为出厂设置

抹掉 Mac 并将它还原为出厂设置 借助“抹掉所有内容和设置”这项功能&#xff0c;你可以快速安全地抹掉所有设置、数据和 App&#xff0c;同时保留当前安装的操作系统。 使用“抹掉所有内容和设置” 这项功能要求装有 macOS Monterey 或更高版本&#xff0c;且使用搭载 Apple 芯…

关联系统-智能座舱控制器ICC

智能座舱构成 如上图所示&#xff0c;智能座舱主要是由仪表、中控、HUD、语音、DMS/OMS等多种交互通道组成&#xff0c;其宗旨是提升人的交互体验&#xff0c;使车辆更加智能化&#xff0c;情感化。 智能座舱内部功能 仪表功能 SR场景重构 如上图所示&#xff0c;仪表区域可实…

Redis相关面试题大全

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于java面试题系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基…

为啥现在4位单片机依然没有被淘汰?

为啥现在4位单片机依然没有被淘汰&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xf…

网络安全概述

目录 网络安全背景 网络安全常识及术语 网络的脆弱性和常见安全攻击 网络环境的开放性 协议栈(TCP/IP)自身的脆弱性 物理层 -- 物理攻击 链路层 网络层 -- ICMP攻击 传输层 -- TCP SYN Flood攻击 应用层 -- DNS欺骗攻击 ​编辑 操作系统的脆弱性及常见安全攻…

DevEco Studio4.0/3.1预览器报错综合整理

题外话&#xff1a;额&#xff0c;这篇文章的由来&#xff0c;是在这篇文章DevEco Studio3.1报错...发布后&#xff0c;仍有人没解决预览不了的问题&#xff0c;然后就有小伙伴让我看看到底哪个地方出错了&#xff0c;为什么按照文章上的去做了&#xff0c;还是无法使用&#x…

HCIP----MGRE实验

实验要求&#xff1a; 第一步&#xff0c;基本的IP地址配置 R1&#xff1a; [R1]int g0/0/1 [R1-GigabitEthernet0/0/1]ip add 192.168.1.1 24 #配置PC的网关 [R1]int Serial 4/0/0 [R1-Serial4/0/0]link-protocol hdlc #R1和R2之间采用hdlc封装 [R1-S…

爬虫入门到精通_基础篇1(爬虫基本原理讲解, Urllib库基本使用)

01 爬虫基本原理讲解 1.什么是爬虫:请求网站并提取数据的自动化程序 2.爬虫基本流程&#xff1a; 发起请求&#xff1a;通过HTTP库向目标站点发起请求&#xff0c;即发送一个Request,请求可以包含额外的headers等信息&#xff0c;等待服务器响应。获取响应内容&#xff1a;如…