ListView的优化 +BaseAdapter适配器

Android ListView核心原理与性能优化实践 ListView作为Android开发中的经典列表控件,基于适配器模式实现数据与视图的分离,是理解Android视图系统的重要入口。其核心机制包括视图复用、数据绑定和滚动处理,通过ViewHolder模式可显著提升长列表性能。在移动应用开发中,列表展示是最常见的UI需求之一,ListView以其简单易用的特性,特别适合处理静态数据展示场景。通过合理使用ArrayAdapter或自定义BaseAdapter,开发者可以快速实现各类列表界面。虽然现代开发中RecyclerView逐渐成为主流,但掌握ListVi 阅读详情

一 . 概念:

首先ListView是一个ViewGroup,是一个以垂直方式在项目中显示View视图的列表。

他也是一个适配器视图,可以通过适当的适配器来让ListView展示数据。

与ListView配合使用的适配器主要包括下面几种:ArrayAdapter、SimpleAdapter、BaseAdapter(重点)、SimpleCursorAdapter(适配器与Cursor的简单结合)。可以毫不夸张的说,几乎任何的软件都会使用到ListView控件,所以该控件及其重要。

 二  先说说ListView的实现大概思路 :

1.准备ListView要显示的数据;

2.使用一个List集合保存数据;

2.构建适配器,简单地来说,适配器就是Item数组,集合有多少元素就生成多少个Item;

3.把适配器添加到ListView,并显示出来。

三  ListView优化具体步骤如下:
①.将布局中的listview控件的宽高固定,避免多次宽高的测量
    android:layout_width="match_parent"
    android:layout_height="match_parent"

②.利用ViewHolder将子视图布局中小控件封装,这样就把item中散在的多个控件合成一个整体,这样可以有效地避免图片错位。  

    3.1  定义一个ViewHolder类,在其中声明子视图中的所有小控件

       3.2 在新加载子视图对象的情况下,将从子视图中找到的小控件保存到viewHolder对象中
           利用convertView的setTag方法,将viewHolder保存        
       3.3  在重复利用子视图的情况下,直接通过convertView的getTag方法,获得ViewHolder对象    

       3.4 从ViewHolder对象中获得小控件对象,给小控件对象设置数据即可.

③.利用BaseAdapter适配器的getView方法的convertView参数,重复利用convertView,这样可以减少填充布局的过程,减少ViewHolder对象实例化的次数。减少内存开销,提高性能。

④convertView的setTag():

        利用setTag()方法将ViewHolder对象作为标签附加到convertView上,当convertView被重复利用的时候,因为上面有ViewHolder对象,所以convertView就具有了ViewHolder中的几个属性,这样就节省了findViewById()这个过程。

⑤.如果Listview中有图片的话,还要处理错位,二级采样,三级缓存问题,当然了,如果用Xutils框架的话,就没有这种烦恼了。

⑥.终极优化,当我们快速滑动listview时,我们可以不加载数据,不适配到Listveiw上来节省流量。

四  代码展示:

public class MainActivity extends Activity {
	private List<String> dataList;<span style="font-family:comic sans ms,sans-serif;">//创建一个空的集合,用于存放显示的数据</span>
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView listView = (ListView) findViewById(R.id.listview);
		initData();
		MyDapter myDapter = new MyDapter(this,dataList);
		listView.setAdapter(myDapter);//记得要把适配到的数据myDapter设置到listView上。</span>
	}
	private void initData() {
		dataList = new ArrayList<String>();
		for (int i = 0; i < 66; i++) {
			dataList.add("明天取个小老婆"+i);
			Log.e("1111111", dataList.toString());
		}	
	}
}

②MyDapter的code
public class MyDapter extends BaseAdapter {
	private List<String> dataList;<span style="font-family:comic sans ms,sans-serif;">//把list集合传送过来</span>
	private Context context;<span style="font-family:comic sans ms,sans-serif;">//上下文对象</span>
	public MyDapter(Context context, List<String> dataList) {
		this.context = context;
		this.dataList = dataList;
	}
	@Override
	public int getCount() {
		return dataList.size();	//集合中的个数</span>
	}
	@Override
	public Object getItem(int position) {
		return dataList.get(position);//存入集合
	}

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {// View convertView可以复用的子视图对象	</span><pre name="code" class="java"><pre name="code" class="java"><span style="color:#000000;"><span style="font-family:comic sans ms,sans-serif;">                                      viewHolder</span></span><span style="color:#330000;"><span style="font-family:comic sans ms,sans-serif;">    viewholder</span> <span style="font-family:comic sans ms,sans-serif;">;</span>
		       if(convertView==null){//<span style="color:#FF0000;">1 如果系统自带的子视图的没有子布局,那就加载一个</span>
			//1.1通过布局加载器得到一个子视图对象</span>
			convertView = LayoutInflater.from(context).inflate(R.layout.item_activity, null);
			//1.2从子布局中找到对象
			TextView  newtextView = (TextView) convertView.findViewById(R.id.item_textView);
			//1.3创建Holder的对象
			viewholder = new viewHolder();
			//1.4将找到的控件赋值到Holder中
			
			//1.5利用convertView的setTag方法,将创建出来的保存有子控件的存进去
			convertView.setTag(viewholder);
			//把子控件的子控件保存到convertView中,下次要用的就直接调用即可,不用重新加载,省去了不必要的耗时,从而得到优化的作用

		}else {
			//2.1如果有可以回收利用的子视图对象,直接重新设置数据,
			//利用convertView的getTag方法找到其中的小控件,直接设置数据
			holder = (Holder) convertView.getTag();
		}
		//3 通过viewHolder对象,获得其中的textview,修改textview的值
		<span style="font-family:comic sans ms,sans-serif;">viewholder</span>.textView.setText(dataList.get(position));
		Log.e("adapter", "重复利用:getView........"+position);
</span>

return convertView;}public class 
viewHolder {//1.定义类,封装子视图中的小控件TextView textView;}}




五 效果展示:

<font color="#000000"><font color="#000000" size="2"><span style="font-size:18px;color:#FF6666;"><span style="font-family:comic sans ms,sans-serif;"><span style="font-size:14px;"><img src="https://img-blog.youkuaiyun.com/20160430124400325?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span></span></span></font></font>


Android ListActivity与BaseAdapter应用实例教程 ListActivity是Android平台的一个特殊Activity类,用于展示一个列表项的集合。它继承自普通Activity,并自带一个ListView组件,开发者只需要专注于列表数据的提供和列表项的布局设计。ListActivity简化了列表相关的操作,使得开发者可以更加便捷地实现列表展示功能。在Android开发中,BaseAdapter是一个强大的工具,允许开发者将数据源和界面组件紧密地绑定在一起。要创建一个自定义适配器,首先需要继承BaseAdapter类。 阅读详情

相关推荐

实现Android中两个ListView的动态增删操作

适配器模式在Android开发中是一个常见的设计模式,它允许我们把一个类的接口转换成客户端所需要的另一个接口。在ListView组件中,适配器扮演着将数据源与界面视图相连接的角色。适配器就像是数据和视图之间的桥梁,使得数据能够以视图的形式展示给用户。没有适配器,ListView将无法知道它应该如何显示数据,也就无法执行其基本的功能。在Android中,BaseAdapter是用于自定义适配器的一个抽象类。

weixin_35391606的博客 856

ListView视图控件与Adapter适配器的使用

一、关于ListView和Adapter ·ListView控件,用于展示拥有一列相同部分的视图。 ·该视图的具体内容需要使用适配器进行指定。定义的适配器类需要继承BaseAdapter并实现它的四个方法: 1、public int getCount() //得到item条目的总数。他返回多少,视图就展示多少条。 2、public Object getItem(int postion) ...

漫漫学习成长之路 1011

Android开发实战:自定义ListView详解与项目实践

当默认的无法满足需求时,例如需要绑定多个控件或执行复杂的逻辑时,可以继承并重写getView()方法来实现自定义适配器。@Override代码逻辑分析:构造函数调用父类构造方法,并传入自定义布局资源。getView()方法中使用加载自定义布局。使用获取布局中的控件,并将数据绑定到控件上。参数说明::表示可复用的视图,如果为null则需要重新inflate布局。position:当前列表项的索引。parent。

weixin_35752233的博客 857

BaseAdapter 作为 ListView 适配器

ListView的填充需要一个adapter,它用来把数据映射到ListView中。以BaseAdapter作为其适配器为例。 BaseAdapter作为适配器使用相对较复杂,但它却能够实现多种列表布局。在BaseAdapter中需要重写一个类继承自BaseAdapter,并且重新实现里面的方法。例如自定义一个类MyAdapter。 public class MyAdapter e

白净垃圾桶- 579

【随机过程】 3 - 随机过程的频域分析1 - 功率谱

随机过程的频域分析 文章目录随机过程的频域分析1. 什么是谱2. 确定信号的频谱2.1 周期信号的频谱2.2 非周期信号的频谱3. 随机信号的谱3.1 随机信号做傅里叶分析的困难3.2 功率谱密度的物理和数学表示形式3.2.1 功率谱密度的物理表示3.2.2 功率谱密度的数学表示3.3 功率谱密度的解读3.3.1 量纲分析3.3.2 谱3.3.3 密度3.3.4 wiener和khinchin3.4 功率谱密度的性质3.4.1 非线性3.4.2 偶函数3.5 wiener-khinchin关系的应用3.6

qq_41741344的博客 3131

修改Avaya IP-Office电话交换机出厂自带的提示语音内容

1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话

qlin4cn的博客 4917

【android】ListView之BaseAdapter使用详解

android中ListView是一个比较常用的控件,它用于方便的列表显示可见数据,当数据过多时,会出现滚动条,并且可以根据屏幕长度进行自适应显示。

此成非彼诚博客 1万+

多层感知机 Multilayer Perceptron | MLP

本文主要简单介绍了多层感知机的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型的参数等。

JasonH2021的博客 3万+

封装MyAdapter,简化子类代码

package org.moblie.trian.testbaseadapter.adapter;import java.util.List;import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; impor

iblade的博客 1161

Intel网卡固件烧录实战:eeupdate与bootutil命令完全解析

固件作为硬件设备底层运行的软件,其稳定性直接决定硬件功能的完整性。网卡固件一旦损坏,常表现为MAC地址丢失、PXE启动失效、NVM数据异常导致降速或掉线。维护这类问题,需借助Intel官方工具eeupdate与bootutil在UEFI Shell或DOS环境下执行底层烧录操作。eeupdate负责网卡的身份信息与NVM存储管理,可重置MAC、恢复固件镜像;bootutil则专管启动行为,支持PXE配置与Boot Agent升级。从环境准备、命令参数到故障恢复,掌握这两款工具能让运维人员在修复存量网卡、应对

weixin_34269583的博客 312

Serdes之什么是(CDR)?

光收发器和电收发器使用的是我们所说的串行数据通信。在这种通信方式中,数据位是按顺序一个接一个地传输的。光收发器和电收发器使用的是我们所说的串行数据通信。在这种通信方式中,数据位是按顺序一个接一个地传输的。目前市场上大多数收发器都没有专用的时钟输入,因此时钟恢复和数据重新定时等功能是在收发器外部(即在主板上)进行的。接收端则需要恢复时钟以采样串行线上的数据。为了实现这一点,接收端需要一个与输入数据频率大致相同的时钟。通过使参考时钟与输入数据信号的跳变相位对齐,可以生成一个恢复的时钟。这被称为时钟恢复。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 2388

ListView控件以及常用数据适配器Adapter的使用+商品展示案例

这次我们来介绍一下ListView控件以及常用数据适配器Adapter的使用,并通过一个商品展示案例来说明。 一.ListView控件在Android开发中ListView是一个比较常用的控件。它以列表的形式展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。接下来介绍一下ListView的常见属性。 ListView常见属性: 1.android:cacheColorHint——设置拖动的背

sinat_33498195的博客 3524

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3547

Android-ListView适配器BaseAdapter的使用和优化

Android-ListView适配器BaseAdapter的使用 这是BaseAdapter的相应的方法属性。 像SimpleAdapter和ArrayAdapter都是继承于BaseAdapter。 可以查看其源码: SimoleAdapter ArrayAdapter 写几个小demo熟悉一下。activity_main.xml 设置组件ListView<Relative

Kid_TH的博客 1万+

【DeepSeek-R1 】分词系统架构解析

DeepSeek-R1 分词系统解析 DeepSeek-R1 采用 SentencePiece Unigram 算法,通过统计语言模型实现高效子词分词。其核心优势包括: 算法对比:相比 BPE/WordPiece,Unigram 基于概率模型,支持多语言,自动回退字符级处理。 特性优化:智能空格处理、数字分桶、多语言统一支持,并采用前缀树索引和 SIMD 并行加速,编码速度达 12,458 tok/s。

赶紧的博客 429

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6629

BaseAdapter自定义适配器和ListView优化以及下拉刷新

实现过程: 重写视图区域: 即重写BaseAdapter          有四方要重写: public int getCount()  数据域大小方法 public Object getItem(int arg0) 返回每个Item的数据据 public long getItemId(int ar

2896405089的博客 697

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

BaseAdapter自定义适配器及ListView的优化

自定义适配器的创建本身是为了实现内容丰富,布局多样的ListView,其中也就穿插了对ListView的优化。 步骤如下: 1:需要定义一个集合来存放ListView中的item对象,当然这个集合也可能是在网站上下载并解析出来的数据 2:自定义一个item的布局文件,这个布局文件就是每个item想要呈现出来的效果。 3:定义一个子类继承自BaseAdapter,并重写为实现的方法 get

Leo Wang的博客 968

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android --- ListView与适配器

ListView 绑定的适配器是 BaseAdapter。

weixin_43244083的博客 2058

【Android】以BaseAdapter做适配器的ListView及其性能优化

适配器的Java类 package com.app.adapter; import org.json.JSONArray; import org.json.JSONObject; import android.R.integer; import android.content.Context; import android.view.LayoutInflater; import andr

欲买桂花同载酒,终不似,少年游。 4900

Android:BaseAdapter的优化方案一览

1.什么是数据适配器? 用来建立数据源和数据渲染控件之间的关系,将数据的来源和数据的显示之间进行解耦,降低耦合性 2.BaseAdapter接口 BaseAdapter是一个抽象类(abstract)【以下代码为android源码】 public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { ...

Lzinner的博客 565

打造一个万能的适配器!!!

最近项目中 经常用listView和GridView ,可以说是项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter 最近抽了时间,自己也打造了一个万能的适配器 看我们之前的一些写法: public class ImageViewAdapter2 extends RecyclerView.Adapter<ImageV...

weixin_33834910的博客 127

ListView 使用BaseAdapter时的getItemViewType 和 getViewTypeCount作用

关于BaseAdapter的基础知识我们在这里就不讲解了: getItemViewType() 和 getItemTypeCount()作用: @Override public int getItemViewType(int position) { Message msg = myList.get(position); int type = msg.getType(); L

一生悬命 2110

DIY固态硬盘全攻略:从选型、量产开卡到避坑实操指南

固态硬盘(SSD)的性能与寿命,本质上由主控、闪存颗粒和固件三者协同决定。主控负责数据调度与磨损均衡,闪存颗粒是存储介质,而固件则定义了设备的行为逻辑。理解这些底层原理,不仅有助于选购成品盘,更能支撑起一项极富工程价值的实践——DIY固态硬盘。在硬件改造或老平台升级场景中,通过自行选配主控板与颗粒,并使用量产工具完成固件写入、坏块标记等“开卡”流程,可以大幅降低大容量SATA SSD的成本,还能深入掌握掉盘、卡顿等故障的根因。本文从存储原理出发,围绕主控方案选型、闪存颗粒甄别、量产参数配置与常见排障技巧展开

weixin_33868027的博客 439
上一篇: 博主写博客的初衷
下一篇: HttpURLConnection下载数据,JSON解析数据, BaseAdapter 适配数据。
Allen-华
博客等级 码龄11年 10粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值