Android studio 之 适配器

这篇具有很好参考价值的文章主要介绍了Android studio 之 适配器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

Android studio 之 适配器,android studio,android studio,gitee,android

数组适配器 ArrayAdapter

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

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

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

<Button
    android: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">
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@mipmap/star"/>
    <TextView
        android: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">

    <ImageView
        android:id="@+id/headIcon"
        android:layout_width="50dp"
        android:layout_height="65dp"
        android:background="@mipmap/study" />

    <TextView
        android: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" />

    <TextView
        android: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文件

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="4">
        <ListView
            android: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() {
    Override
    public 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">
    
    <ImageView
        android:id="@+id/base_icon"
        android:src="@mipmap/study"
        android:layout_width="80dp"
        android:layout_margin="5dp"
        android:layout_height="80dp"/>

    <TextView
        android: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" />

    <TextView
        android: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" />

    <TextView
        android: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="这是内容" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/base_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/base_icon1"
            android:layout_width="40dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:src="@mipmap/star" />

        <ImageView
            android:id="@+id/base_icon2"
            android:layout_width="40dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:src="@mipmap/star" />

        <ImageView
            android: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的长度)
    @Override
    public 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 布局资源转换成view
        convertView = 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() {
            @Override
            public void onClick(View v) {
              //  System.out.printf("点击了"+tN.getText());
                Toast.makeText(context,"你点击了"+m.getNickName(),Toast.LENGTH_SHORT).show();
            }
        });
        return convertView;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public 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文章来源地址https://www.toymoban.com/news/detail-818282.html

    /**
     * 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;

到了这里,关于Android studio 之 适配器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 万能的RecyclerView适配器(BaseRecyclerViewAdapterHelper)

    基本使用: 快速使用 如果Adapter特别简单,可以使用BuickViewHolder 点击事件: item 点击事件 item 长按事件 item 子控件点击事件 item 子控件长按事件 点击事件(扩展) 去除点击抖动(双击)的点击方法。 默认500毫秒间隔,可以传递参数修改。 数据操作 设置数据集合 修改某一位

    2024年04月10日
    浏览(37)
  • 一线互联网架构师360°全方面性能调优,android适配器ui

    为什么要使用多进程 对于进程的概念,来到这里的都是编程修仙之人,就不再啰嗦了,相信大家倒着、跳着、躺着、各种姿势都能背出来。 相信很多同学在实际开发中,基本都不会去给app划分进程,而且,在Android中使用多进程,还可能需要编写额外的进程通讯代码,还可能

    2024年04月13日
    浏览(44)
  • 11_Pulsar Adaptors适配器、kafka适配器、Spark适配器

    2.3. Pulsar Adaptors适配器 2.3.1.kafka适配器 2.3.2.Spark适配器 2.3.1.kafka适配器 Pulsar 为使用 Apache Kafka Java 客户端 API 编写的应用程序提供了一个简单的解决方案。 在生产者中, 如果想不改变原有kafka的代码架构, 就切换到Pulsar的平台中, 那么Pulsar adaptor on kafka就变的非常的有用了, 它可

    2024年02月14日
    浏览(47)
  • 网络适配器是什么 网络适配器有什么用

    网络适配器是什么? 网络适配器又称网卡或网络接口卡(NIC),英文名NetworkInterfaceCard。它是使计算机联网的设备。平常所说的网卡就是将PC机和LAN连接的网络适配器。网卡(NIC) 插在计算机主板插槽中,负责将用户要传递的数据转换为网络上其它设备能够识别的格式,通过

    2024年02月05日
    浏览(57)
  • 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?

            关于适配器模式,今天我们主要学习它的两种实现方式,类适配器和对象适配器,以及5种常见的应用场景。同时,我还会通过剖析slf4j日志框架,来给你展示这个模式在真实项目中的应用。除此之外,在文章的最后,我还对代理、桥接、装饰器、适配器,这4种代

    2024年02月13日
    浏览(56)
  • 【C++】STL 算法 ⑩ ( 函数适配器 | 函数适配器概念 | 函数适配器分类 | 函数适配器辅助函数 | std::bind2nd 函数原型及示例 | std::bind 函数原型及示例 )

    在 STL 中 预定义了很多 函数对象 , 如果要 对 函数对象 的 参数 / 返回值 进行 计算 或 设置 , 可以 使用 \\\" 函数适配器 \\\" 实现上述需求 ; \\\" 函数适配器 \\\" 可以 将 已存在的 函数对象 转化为 另一种符合要求的 函数对象 ; \\\" 函数适配器 \\\" 定义在 functional 头文件 中 ; \\\" 函数适配器

    2024年02月02日
    浏览(65)
  • 网络适配器没有启用tcp/ip服务,WLAN 适配器的驱动程序可能出现问题

    笔记本抽风。登得上wifi和热点,但网不能用,“无法访问Internet”   win10自带的网络诊断提示: “找到问题 WLAN 适配器的驱动程序可能出现问题 Windows 无法自动将 IP 协议堆栈绑定到网络适配器。 未修复 无线网络 适配器出现问题 已失败 ” 试了试火绒的断网修复,提示网络

    2024年02月11日
    浏览(54)
  • [go] 适配器模式

    将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。 Client:是包含当前程序业务逻辑的类 客户端代码只需通过与适配器交互即可,无需与具体的适配器耦合。因此,你可以向程序中添加新类型的适配器而无需修改已有代码。这在服

    2024年01月19日
    浏览(41)
  • 适配器模式

    将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 想使用一个已经存在的类,而他的接口不符合你的需求 想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作——? 想使用一些已经存在

    2024年02月02日
    浏览(28)
  • java 适配器模式

    适配器模式(Adapter Pattern) 结构型设计模式,见名知意,就是两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。 主要解决: 常常要将一些\\\"现存的对象\\\"放到新的环境中,而新环境要求的接口是现对象不能满足的。 关键代码: 适配器继承或依赖已有的对象,实现

    2024年04月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包