Android之通过BaseAdapter自定义适配器的使用

2023-10-31

通过BaseAdapter创建自定义适配器。在所有的适配器中,通过BaseAdapter定义的适配器非常好用,可以自定义ListView每行布局的样式,使用非常的广泛,是开发过程中必不可少的。
下面看一个效果图:
接下来一起来实现聊天列表:
1.主布局代码:
<RelativeLayout 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.example.baseadapterdemo.MainActivity" >
    
    <RelativeLayout
        android:id="@+id/relativeLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#fc424c"
        android:padding="3dp"
        android:paddingLeft="5dp"
        android:paddingRight="5dp" >

        <TextView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="列表"
            android:textColor="#fff"
            android:textSize="25sp" />

    </RelativeLayout>
    
    <ListView 
        android:id="@+id/main_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/relativeLayout"
        android:divider="#f00"
        ></ListView>

</RelativeLayout>

2.建立一个xml布局,是listView每行的布局:
<?xml version="1.0" encoding="utf-8"?>
<!--行布局文件-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:padding="4dp"
    android:orientation="vertical" >

    <ImageView
        android:padding="3dp"
        android:id="@+id/item_img"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/item_time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:gravity="center"
        android:text="时间" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@id/item_time"
        android:layout_toRightOf="@id/item_img"
        android:layout_alignParentTop="true"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/item_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:textSize="20sp"
            android:text="张三" />

        <TextView
            android:textSize="14sp"
            android:id="@+id/item_content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_vertical"
            android:text="在做什么呢?" />
    </LinearLayout>

</RelativeLayout>

3.创建一个实体类,用于封装数据:
每行布局中包括一个图片、姓名、聊天内容、时间,所以要将这几个数据进行封装
package com.example.vo;
/**
 * 实体类
 * 将行布局的内容进行封装
 * @author Dell
 *
 */
public class ListVO {
	//图片
	private int mImg;
	//姓名
	private String mName;
	//内容
	private String mContent;
	//时间
	private String mTime;

	//无参
	public ListVO() {
		super();
	}

	//有参
	public ListVO(int mImg, String mName, String mContent, String mTime) {
		super();
		this.mImg = mImg;
		this.mName = mName;
		this.mContent = mContent;
		this.mTime = mTime;
	}

	//setter,getter
	public int getmImg() {
		return mImg;
	}

	public void setmImg(int mImg) {
		this.mImg = mImg;
	}

	public String getmName() {
		return mName;
	}

	public void setmName(String mName) {
		this.mName = mName;
	}

	public String getmContent() {
		return mContent;
	}

	public void setmContent(String mContent) {
		this.mContent = mContent;
	}

	public String getmTime() {
		return mTime;
	}

	public void setmTime(String mTime) {
		this.mTime = mTime;
	}

}
4.创建自定义适配器类,继承BaseAdapter:
a.定义2个参数(context,和List<实体类>),通过构造方法进行赋值.
b.重写4个方法。
①getCount()方法,返回动态数组中有多少数据。
②getView()方法,,通过LayoutInflater对象绑定行布局文件,创建出一个View对象;通过View对象findViewByID()获得行布局控件,设置文本与图片; 返回View对象。
package com.example.adapter;
/**
 * 自定义适配器。
 */
import java.util.List;

import com.example.baseadapterdemo.R;
import com.example.vo.ListVO;

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;

public class MyBaseAdapter extends BaseAdapter{
	//定义两个参数,一个是Context对象,一个是ListVO实体类型动态数组
	private Context mContext;
	private List<ListVO> mList;
	

	//有参构造
	public MyBaseAdapter(Context mContext, List<ListVO> mList) {
		super();
		this.mContext = mContext;
		this.mList = mList;
	}

	//总行数
	@Override
	public int getCount() {
		return mList.size();
	}

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

	@Override
	public long getItemId(int position) {
		return 0;
	}

	//布局
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		View view = null;
		if (convertView == null) {
			view = LayoutInflater.from(mContext).inflate(R.layout.item_main, null);
		}else {
			view = convertView;
		}
		//绑定布局
		ImageView img = (ImageView) view.findViewById(R.id.item_img);
		TextView name = (TextView) view.findViewById(R.id.item_name);
		TextView content = (TextView) view.findViewById(R.id.item_content);
		TextView time = (TextView) view.findViewById(R.id.item_time);
		//设置内容
		img.setImageResource(mList.get(position).getmImg());
		name.setText(mList.get(position).getmName());
		content.setText(mList.get(position).getmContent());
		time.setText(mList.get(position).getmTime());
		return view;
	}


}

5.主类
 a.声明适配器控件并绑定ID;
b.声明自定义适配器并实例化;
c.添加数据;
d.绑定适配器。
package com.example.baseadapterdemo;
import java.util.ArrayList;
import java.util.List;

import com.example.adapter.MyBaseAdapter;
import com.example.vo.ListVO;

/**
 * 主类
 */
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.ListView;

public class MainActivity extends Activity {
	//适配器控件ListView
	private ListView mListView;
	//适配器
	private MyBaseAdapter mAdapter;
	//动态数组
	private List<ListVO> mList = new ArrayList<ListVO>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		bindID();
		//添加数据
		addData();
		//实例化适配器
		mAdapter = new MyBaseAdapter(MainActivity.this, mList);
		//绑定适配器
		mListView.setAdapter(mAdapter);
	}

	private void addData() {
		//创建对象
		ListVO v1 = new ListVO(R.drawable.a1, "张三", "最近在做什么事情呢", "11:11");
		ListVO v2 = new ListVO(R.drawable.a2, "李四", "王五说她不爱我了", "12:21");
		ListVO v3 = new ListVO(R.drawable.a3, "王五", "我抛弃了他", "13:13");
		ListVO v4 = new ListVO(R.drawable.a4, "赵六", "哈哈哈", "14:41");
		ListVO v5 = new ListVO(R.drawable.a5, "小明", "适配器好简单", "16:06");
		ListVO v6 = new ListVO(R.drawable.a6, "小刚", "6666666666", "18:11");
		ListVO v7 = new ListVO(R.drawable.a7, "李华", "英语作文被我包了", "18:51");
		//添加到数组
		mList.add(v1);
		mList.add(v2);
		mList.add(v3);
		mList.add(v4);
		mList.add(v5);
		mList.add(v6);
		mList.add(v7);
		//置为空
		v1 = null;
		v2 = null;
		v3 = null;
		v4 = null;
		v5 = null;
		v6 = null;
		v7 = null;
	}

	//绑定id
	private void bindID() {
		mListView = (ListView) findViewById(R.id.main_listView);
	}
}

这样就完成了。
文件打包:http://download.csdn.net/detail/qq_26239671/9715728
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android之通过BaseAdapter自定义适配器的使用 的相关文章

  • 找不到参数的方法 dependencyResolutionManagement()

    我正在尝试使用老师给我的一个项目 但它显示了一个错误 Settings file Users admin AndroidStudioProjects HTTPNetworking settings gradle line 1 A probl
  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • SearchView过滤ListView

    我已经实现了搜索视图来过滤我的列表视图项目 当我输入任何文本时 它会过滤列表 但当我退出搜索视图时 它不会返回原始列表项 public class PlacesListAdapter extends ArrayAdapter
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • Android Activity 生命周期函数基础知识

    我正在测试这段代码 它显示活动所处的状态 public class Activity101Activity extends Activity String tag Lifecycle Called when the activity is
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 错误:在根项目“projectName”中找不到项目“app”

    我有一个在 Eclipse 中开发的旧应用程序 现在尝试将其迁移到 Android Studio 我更新了库并遵循了基本步骤 现在 我收到此错误 Error Project app not found in root project pro
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • 如何确定对手机号码的呼叫是本地呼叫还是 STD 或 ISD

    我正在为 Android 开发某种应用程序 但不知道如何获取被叫号码是本地或 STD 的号码的数据 即手机号码检查器等应用程序从哪里获取数据 注意 我说的是手机号码 而不是固定电话 固定电话号码 你得到的数字是字符串类型 因此 您可以获取号
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时

随机推荐

  • 使用带有语法的域来优化集合重载运算符的实现

    使用带有语法的域来优化集合重载运算符的实现 C 是一种高效且灵活的编程语言 但是在处理集合操作时 常常需要提供多个重载运算符 这会导致代码量增长 维护困难等问题 为了解决这些问题 可以使用boost proto模块来实现使用一个带有语法的域
  • 最详细的下载安装PicGo图床配合Typora使用

    1 node js下载安装 1 2 检验安装成功 2 PicGo下载安装 3 配置Gitee 配合PicGo使用 3 1 获取PicGo的token 4 配置PicGo 4 1 下载插件 4 2 配置图床 Gitee 4 3 配置Typor
  • Umi创建react项目之配置额外的 postcss 插件。

    步骤1 安装插件 注意 安装6 x x版本的postcss pxtorem 会报错 object Object is not a PostCSS plugin npm i lib flexible D npm i postcss pxtor
  • h5游戏使用微信h5支付,刷新页面问题解决

    遇到的问题 h5游戏 或任何h5程序 使用微信h5支付后 自动刷了页面 导致用户体验极差 问题根本原因 h5端使用微信支付时 使用了以下代码 window localtion href https wx tenpay com cgi bin
  • MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)

    PS 来源表 t source 目标表 t target 第一种 来源表和目标表字段完全一致 insert into t target select from t source 第二种 来源表和目标表字段部分一致 只想导入来源表部分字段到目
  • Unity基础 单点和多点触摸

    总结一下触摸事件 最简单的鼠标单点点击触摸 也可以在安卓和IOS上面实现触屏的操作 OnMouseDown 鼠标按下 点击的一瞬间触发 OnMouseDrag 鼠标持续按住拖动触发 OnMouseEnter 鼠标经过物体时触发 OnMous
  • [PyTroch系列-2]:Facebook PyTroch简介、生态环境、开发架构、软件架构

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 PyTroch系列 2 Facebook PyTroch简介 生态环境 开发架构 软件架构 文火冰糖 王文兵 的博客 CSDN博客 第1章
  • git远程仓库新建了分支,但是vscode分支管理里还没有这个分支怎么办

    git远程仓库新建了分支 但是vscode分支管理里还没有这个分支怎么办 git终端输入以下命令 成功后再次查看 就有了 git fetch origin 分支名
  • Jenkins基础篇--Docker容器部署

    容器部署Jenkins的优势 1 安全 容器之间的进程是相互隔离的 单独容器环境稳定 宿主机中环境变量的修改 不容易影响容器的运行结果 2 更轻松地部署和扩展 容器可方便迁移 一次交付 多次利用 容器可将打包好的jenkins环境迁移到其他
  • spark-sql提交参数详解整理

    1 spark任务提交 当SPARK SQL开发完成后需要将其提交到大数据平台上去跑 提交的时候需要对要使用的资源参数进行设置 目的 a 让任务在正确的环境下运行 b 根据任务自身情况 设置合理参数 提高运行效率 2 设置参数说明 2 1
  • python是从abc发展_Python 简介

    Python 简介 Python 是一门解释型语言 因为无需编译和链接 你可以在程序开发中节省宝贵的时间 Python 解释器可以交互的使用 这使得试验语言的特性 编写临时程序或在自底向上的程序开发中测试方法非常容易 Python 是面向对
  • 简单易懂矩阵螺旋打印

    简单易懂矩阵螺旋打印 C语言 给定一个 m 行 n 列的矩阵 请按照顺时针螺旋的顺序输出矩阵中所有的元素 输入格式 首先在第一行输入 2 个整数 分别对应题目描述中的 mm 和 nn 1 leq m n leq 1001 m n 100 之
  • 设置入校时间字段的有效性规则为_2012年计算机二级Access第二十六套上机试题及答案详解...

    1 基本操作题 在考生文件夹下 存在一个数据库文件 samp1 mdb 和一个图像文件 photo bmp 在数据库文件中已经建立一个表对象 tStud 试按以下操作要求 完成各种操作 1 设置 ID 字段为主键 并设置 ID 字段的相应属
  • UE4 C++ 用蓝图调用C++里定义的变量、方法

    UE4 C 用蓝图调用C 里定义的变量 方法 这是一个Object的C 脚本 h UCLASS Blueprintable 可被蓝图继续 class BASICTRAINING API UMyObject public UObject GE
  • 企业微信接入自研小程序流程

    一 背景 企业微信是企业内部办公常用的即时通讯工具 可以作为企业内部工作的枢纽 例如 重要内容通知 重要应用的集成等 二 自研程序接入企业微信配置 1 登录企业微信管理后台https work weixin qq com 2 找到应用管理
  • java -jar xxx.jar中没有主清单属性

    使用Spring Initailizr创建的项目 使用mvn打包后 java jar xxx jar显示xxx jar中没有主清单属性 去掉标签即可
  • Java实现阿里云短信发送功能(保姆级!!!搞懂短信功能,这一篇就够了!)

    目录 一 准备工作 1 功能如何切入 2 为什么要用阿里云来实现 二 阿里云部分 三 代码部分 OK 分享结束 收 一 准备工作 1 功能如何切入 第一步 分析业务需求 想要实现短信通知功能那就要有短信的收发双方 而手机上的短信功能需要占用
  • FFmpeg滤镜:制作图片视频流

    iPhone相册有个 为你推荐 功能 它会挑选一些照片形成一个主题 点击后可以像视频一样播放 那么 怎样才能把多张照片转成一个视频文件呢 使用FFmpeg可以这么来做 ffmpeg f image2 framerate 0 5 i D MT
  • Qt使用QSplitter实现分割窗口

    分割窗口在应用程序中经常用到 它可以灵活分布窗口布局 经常用于类似文件资源管理器的窗口设计中 然后抱着这样的想法简单的实现了下 cpp view plain copy print main cpp include
  • Android之通过BaseAdapter自定义适配器的使用

    通过BaseAdapter创建自定义适配器 在所有的适配器中 通过BaseAdapter定义的适配器非常好用 可以自定义ListView每行布局的样式 使用非常的广泛 是开发过程中必不可少的 下面看一个效果图 接下来一起来实现聊天列表 1