我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android BaseAdapter适配器详解用法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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:class="lazy" data-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;
        }
    }



}

演示

在这里插入图片描述

到此这篇关于Android BaseAdapter适配器详解用法的文章就介绍到这了,更多相关Android BaseAdapter内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android BaseAdapter适配器详解用法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android之自定义实现BaseAdapter(通用适配器二)

在上一篇通用适配器一中,我们已经把ViewHolder抽取为了一个通用的持有类,极大程度上减少了我们对代码的书写,现在开始在那样的基础上在此抽取,从而达到更优。先回顾上一篇中的MyAdapter.java类中的代码,然后通过这个代码我们再一
2022-06-06

Android之自定义实现BaseAdapter(通用适配器三)

在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化。实现原理是这样的,每次在setData中都要查找控件,然后setXXX()什么的,我们可以把这写
2022-06-06

Android之自定义实现BaseAdapter(通用适配器一)

通过前面的优化布局之后,我们接着来讲如何打造一个通用的适配器,那么通用适配器能干吗呢?很简单,减少我们对代码的书写,下面开始上代码了。 MyAdapter.javapublic class MyAdapter extends BaseAda
2022-06-06

【android】ListView之BaseAdapter使用详解

android中ListView是一个比较常用的控件,它用于方便的列表显示可见数据,当数据过多时,会出现滚动条,并且可以根据屏幕长度进行自适应显示。 1. 为什么使用BaseAdapter? ListView需要设置数据适配,就是添加你需要
2022-06-06

Android中 自定义数据绑定适配器BaseAdapter的方法

代码如下:public class PersonAdapter extends BaseAdapter { private List persons;// 要绑定的数据 private int resource;// 绑定的一个条目界面的i
2022-06-06

Android SimpleAdapter适配器使用详解

Android SimpleAdapter使用详解HolderAdapter背景Android的AdapterView用的比较多,ListView,GridView,Spinner等,原生的BaseAdapter对ViewHolder没有支
2023-05-31

Android ListView适配器(Adapter)优化方法详解

Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍: Adapter的作用就是ListView界
2022-06-06

Android中BaseAdapter的用法分析与理解

本文实例分析了Android中BaseAdapter的用法。分享给大家供大家参考,具体如下: 最近做一个项目,项目中用到了ListView,ListView最重要的就是绑定数据,这个数据由Adapter来提供,这里我重写了BaseAdapt
2022-06-06

Android深色模式适配适配过程详解

这篇文章主要介绍了Android深色模式适配适配过程,深色模式其实就是我们经常讲到的夜间模式,与白天模式我们需要的屏幕高亮不同,晚上更加需要的是柔和的光,有助于减少手机对眼睛的伤害
2023-05-14

详解Android MacAddress 适配心得

android 6.0以下mac地址获取我们获取mac地址一般都是这样写的: public static String
2023-05-30

Android各版本兼容性适配详解

这篇文章主要为大家介绍了Android各版本兼容性适配详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-19

Android Adapter适配器使用示例讲解

这篇文章主要为大家介绍了Android Adapter适配器使用示例讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

Android编程中常用适配器及自定义适配器用法实例分析

本文实例讲述了Android编程中常用适配器及自定义适配器用法。分享给大家供大家参考,具体如下: 一、适配器. 顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较
2022-06-06

JavaScript适配器模式的应用详解

这篇文章主要介绍了理解JavaScript中的适配器模式,适配器模式即AdapterPattern,是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,下文更多相关介绍需要的小伙伴可以参考一下
2022-11-13

Android再探全面屏适配示例详解

这篇文章主要为大家介绍了Android再探全面屏适配示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-01

详解Android Studio 3.0的新特性与适配

简介Android Studio升级到3.0后,有不少的改动和新特性,先贴出官方的迁移说明。本文会持续收集与总结本人在使用Android Studio 3.0进行开发的过程中所遇到的问题。版本配置Gradle版本 Android Stud
2023-05-30

Android Spinner与适配器模式详解及实例代码

最近做项目对Android Spinner 使用,这里简单写个小例子,来测试如何使用。 Spinner是一个下拉列表,往安卓界面中拖拽一个Spinner控件,在属性中设置Android:entries=“@array/spinner_dat
2022-06-06

Android的分辨率和屏幕适配详解

一、为什么Android要进行分辨率与屏幕适配最大的原因是碎片化,因为Android的开源措施和各个厂商的自己细微修改,结果就变成了这个样需要适配的屏幕尺寸就有这么多:这怎么可能嘛T_T。所以我们就只照顾大部分人,根据友盟的统计数据如下:所
2022-06-06

Android 手机屏幕适配解决办法

0. 前言Android的屏幕适配,即使得某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,这个问题一直以来都是我们Android开发者不得不面对的问题。本文参考了很多前人的博客,并对这一问题做一个总结,力求精简明了。
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录