Android BaseAdapter适配器详解用法

目录
  • ListView和GridView
  • 显示与缓存机制
  • BaseAdapter
  • 使用演示
    • 布局
      • ListView
      • 所加条目
    • 创建数据源
      • JavaBean存放数据
      • 初始化数据源
      • 设置条目的单机和长按事件
    • 创建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;
        }
    }

}

演示

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

(0)

相关推荐

  • Android自定义实现BaseAdapter的优化布局

    上一篇中我们介绍了自定义实现BaseAdapter的普通实现布局,然而上一章也说了普通实现的方式效率会很低,而且对系统开销也很大,所以,那样的实现是为了让初学者能知道可以这样使用,在实际项目中不可能使用那种方式的,要是你在做项目的时候使用普通布局方式,我敢保证,不过试用期你的老板就给你飞机票走人了,好了,闲话少说,本次讲解一下优化布局的实现,看完代码后,你会觉得,其实很简单. MainActivity.java public class MainActivity extends AppCompa

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

    在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化.实现原理是这样的,每次在setData中都要查找控件,然后setXXX()什么的,我们可以把这写实现放如到ViewHolder中去,在ViewHolder中写入一个链式的方法,来帮助我们来实现功能(关于ViewHodler类的代码我就不再重复写了,代码在此:Android之自定义实现BaseAdapter(通用适配器一) ),链式方法如下: public

  • Android自定义实现BaseAdapter的普通实现

    对于ListVie来说,数据项的设置有很多种方式,而自定义实现BaseAdapter是最经常用的了,那么这里我们来讲解一下自定义实现BaseAdapter的普通实现. MainActivity.java public class MainActivity extends AppCompatActivity { //数据源 private List<String> data; //ListView控件 private ListView mList; @Override protected voi

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

    通过前面的优化布局之后,我们接着来讲如何打造一个通用的适配器,那么通用适配器能干吗呢?很简单,减少我们对代码的书写,下面开始上代码了. MyAdapter.java public class MyAdapter extends BaseAdapter { private List<Student> data; public MyAdapter(List<Student> data) { this.data = data; } @Override public int getCoun

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

    在上一篇通用适配器一中,我们已经把ViewHolder抽取为了一个通用的持有类,极大程度上减少了我们对代码的书写,现在开始在那样的基础上在此抽取,从而达到更优.先回顾上一篇中的MyAdapter.java类中的代码,然后通过这个代码我们再一次抽取封装. public class MyAdapter extends MyBaseAdapter { public MyAdapter(List<Student> data) { super(data); } @Override public View

  • Android BaseAdapter适配器详解用法

    目录 ListView和GridView 显示与缓存机制 BaseAdapter 使用演示 布局 ListView 所加条目 创建数据源 JavaBean存放数据 初始化数据源 设置条目的单机和长按事件 创建BaseAdapter及设置缓存 设置适配器 完整主代码 演示 ListView和GridView ListView,列表视图,是Android中最重要的组件之一,几乎每个Android应用中都会使用ListView.是一个以垂直方式在项目中显示View视图的列表. GridView,网格试

  • Android Git submodule详解用法示例

    目录 引入 创建 submodule 本地配置 代码提交 主项目上的代码提交 submodule独立项目上的代码提交 删除 submodule 引入 假定我们有两个项目:Cup 和 Water,其中 Cup 表示主项目,而 Water 表示子模块项目. 其中 Cup 的远程仓库地址为 git@github.com:SkyMissT/Cup.git 而 Water 的远程仓库地址为 git@github.com:SkyMissT/Water.git 接下来,我们希望在 Cup 中添加 Water

  • Android 文件存储与SharedPreferences存储方式详解用法

    目录 持久化技术简介 文件存储 1. 将数据存储到文件中 2. 从文件中读取数据 SharedPreferences 存储 1. 将数据存储到 SharedPreferences 中 2. 从 SharedPreferences 中读取数据 持久化技术简介 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机的情况下,这些数据也不会丢失.保存在内存中的数据是处于瞬时状态的,而保存在存储设备的数据是处于持久状态的.持久化技术提供了一种机制,可以让数据在瞬时状态和持久状

  • Kotlin开发Android应用实例详解

    Kotlin开发Android应用实例详解 相关文章:关于Kotlin语言的基础介绍: http://www.jb51.net/article/114086.htm 我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有浓厚的兴趣,暂且理解为对它感兴趣吧,哈哈哈.那么,我们该如何在Android中应用这门新的语言呢?今天的这篇文章带你学习使用Kotlin开发Android应用,并对比我们传统语言Java,让你真真切切的感受到他的美和优雅. 配置 项目g

  • Android 中Seekbar详解及简单实例

    Android 中Seekbar详解及简单实例 做到音频播放和音乐播放时,大多数都要用到Seekbar.现在我先简单介绍下Seekbar的几个重要属性. android:max 设置值的大小 . android:thumb="@drawable/" 显示的那个可拖动图标,如果没有设置该参数则为系统默认,如果自己需要重新定义,则将自己需要的图标存放在资源目录 /res/drawable下,然后调用即可. android:thumbOffset 拖动图标的偏量值,可以让拖动图标超过bar的

  • Android Handler的详解及实例

    Android Handler的详解 Handler我们常常用于通知主线程做相对应的操作,但是如果使用不但的话就会造成内存泄露,所以记录写正确的Handler写法. Handler handler = new Handler() { public void handleMessage(Message msg) { //do something }; }; handler.sendEmptyMessageDelayed(0, 100 * 1000); 像上面的代码片段,就会存在内存泄露的风险,因为

  • Android 文件操作详解及简单实例

     Android 文件操作详解 Android 的文件操作说白了就是Java的文件操作的处理.所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了.好了,话不多说,开始今天的正题吧. 先从一个小项目入门吧 首先是一个布局文件,这一点比较的简单,那就直接上代码吧. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

  • Android中SharedPreference详解及简单实例

     Android中SharedPreference详解 SharedPreference是Android提供的一种轻量级的数据存储方式,主要用来存储一些简单的配置信息,例如,默认欢迎语,登录用户名和密码等.其以键值对的方式存储,使得我们能很方便进行读取和存入. SharedPreference 文件保存在/data/data/<package name>/shared_prefs 路径下(如/data/data/com.android.alarmclock/shared_prefs/com.a

  • Android LayoutInflater.inflate()详解及分析

    Android  LayoutInflater.inflate()详解 深入理解LayoutInflater.inflate() 由于我们很容易习惯公式化的预置代码,有时我们会忽略很优雅的细节.LayoutInflater以及它在Fragment的onCreateView()中填充View的方式带给我的就是这样的感受.这个类用于将XML文件转换成相对应的ViewGroup和控件Widget.我尝试在Google官方文档与网络上其他讨论中寻找有关的说明,而后发现许多人不但不清楚LayoutInfl

  • Android AOP 注解详解及简单使用实例(三)

    Android  注解 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) 一.简介 在Android 里面 注解主要用来干这么几件事: 和编译器一起给你一些提示警告信息. 配合一些ide 可以更加方便快捷 安全有效的编写Java代码.谷歌出的support-annotations这个库 就是主要干这个的. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁. 二

随机推荐