Android 自定义适配器逐步优化

Android自定义下拉列表组件设计与实现 本文还有配套的精品资源,点击获取 简介:在Android开发中,Spinner组件用于提供用户选择的下拉列表,但有时需要更丰富的用户体验。本项目"DropView"提供了一个增强版的自定义下拉列表,它扩展了原生Spinner的功能,提供了自定义样式、动画效果、可扩展视图、触摸反馈、事件监听、适配器支持和性能优化等特性。开发者通过引入相关文件和简单的配置,便能实现一个更加个性... 阅读详情

// 很多人在使用自定义适配器的时候存在执行效率低,内存消耗大,代码
// 不够优化的问题,下面列出Android 几种自定义适配器的写法

  1. 第一种方式没有实现布局对象的复用,使用自定义适配器中上下文与资源id参数获取” 自定义布局对象 ” ,获取到自定义布局对象之后,便可以根据,控件Id找到各个控件,返回值为你自定义对象的一个界面,容器中需要多项,自定义布局的界面来填充

    /*
    //第一种方式:没有实现布局对象的复用
    // TODO 生成显示数据项的布局对象
    //根据布局的xml文件生成布局对象
    //得到LayoutInflater对象
    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
    //LayoutInflater对象可以根据布局的xml文件生成布局对象
    //第二个参数必须是null,因为如果不是null,会去调用ListView的addView()方法,而ListView没有这个方法
    View view = inflater.inflate(resourceId, null);
    //System.out.println(“=====”+view);
    //convertView接收的是可复用的布局对象,当没有可复用的布局对象时,接收的是null
    //System.out.println(“=====”+convertView);
    //把要显示的数据放到布局对象中的TextView上,得到TextView对象
    //从整体的布局对象中获取TextView对象
    TextView textView = (TextView) view.findViewById(R.id.textView);
    //给textView的text属性设置为当前显示的数据项
    textView.setText(datas.get(position).toString());
    return view;

/方式二:利用convertView 实现了 布局对象的复用,一个布局对象,就是容器中显示的一个条目,由于手机屏幕大小优先,当之前的布局项滑出屏幕时,
之后的,条目复用之前滑出屏幕的条目

    //convertView接收的是可复用的布局对象,当没有可复用的布局对象时,接收的是null
    //先判断是否有可复用的
    /*if(convertView==null){   // 一条一条  从convertView 中去拿
        //convertView = LayoutInflater.from(context).inflate(resourceId, null);
        convertView = LayoutInflater.from(context).inflate(resourceId, parent, false);
    }
    //得到布局对象中的TextView对象
    //每次都要findViewById,影响程序性能
    TextView tv = (TextView) convertView.findViewById(R.id.textView);
    tv.setText(datas.get(position).toString());
    return convertView;*/







    //第三种方式:减少findViewById执行的次数

在执行过一次findViewById 之后,自定义布局内,控件的id值存入
ViewHolder的全局变量中,下次赋值的时候 ,直接从类中出即可

    ViewHolder holder = null;
    if(convertView ==null){
        convertView = LayoutInflater.from(context).inflate(resourceId, parent, false);
        holder = new ViewHolder();
        //让holder中的textView成员指向布局对象中的TextView对象
        holder.textView = (TextView) convertView.findViewById(R.id.textView);
        convertView.setTag(holder);
    }
    else
    {
       holder = (ViewHolder) convertView.getTag();//当可复用时,直接获取holder
    }

    //操作holder中的textView就是操作布局对象中的TextView对象
    holder.textView.setText(datas.get(position).toString());
    return convertView;
}
//通过ViewHolder减少findViewById方法执行的次数
class ViewHolder
{
    TextView textView;
}

// 方式 自定义布局中控件 过多,findViewById 会显得代码不好看
此时我们可以在 ViewHolder中加入一个成员变量,并提供一个getViewById(int ResourceId) 的方法,将convertView的值通过构造方法传入,方法返回控件对象

package com.example.gp11_day10_listview6_cbk1.adapter;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.example.gp11_day10_listview6_cbk1.R;
import com.example.gp11_day10_listview6_cbk1.asynctask.DownTask;
import com.example.gp11_day10_listview6_cbk1.entity.CbkData;

import android.content.Context;
import android.graphics.Bitmap;
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 abstract class CbkDataAdapter extends BaseAdapter {

private Context context;
private List<CbkData> datas;

public CbkDataAdapter(Context context, List<CbkData> datas) {
    super();
    this.context = context;
    this.datas = datas;
}

@Override
public int getCount() {
    int count = 0;
    if(datas!=null)
        count = datas.size();
    return count;
}

@Override
public Object getItem(int position) {
    return datas.get(position);
}

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

@Override
public View getView(int position, View convertView, final ViewGroup parent) {
    ViewHolder holder =null;
    if(convertView==null){

        convertView = LayoutInflater.from(context).inflate(R.layout.item_cbk, parent, false);

        holder = new ViewHolder(convertView);

        convertView.setTag(holder);
    }
    else
        holder = (ViewHolder) convertView.getTag();

    //显示数据
    showDatas(holder,datas.get(position));

    return convertView;
}
public abstract void showDatas(ViewHolder holder,CbkData data);

public class ViewHolder
{
    private Map<Integer,View> views;//存放布局对象中的视图对象
    private View itemView;//布局对象

    public ViewHolder(View itemView)
    {
        this.itemView = itemView;
        views = new HashMap<Integer,View>();
    }
    //根据视图的id得到视图对象
    public View getView(int id)
    {
        View view = views.get(id);
        if(view==null)
        {
            view = itemView.findViewById(id);
            views.put(id, view);
        }
        return view;
    }
}

}

创建自定义Android滑动表格控件 自定义视图是Android应用开发中一个高级而强大的功能,允许开发者创建具有独特外观和行为的UI组件。这不仅增强了用户体验,还提高了应用的可重用性。在本章,我们将开始构建自己的视图类,并探讨基础概念及其构建过程。自定义视图类的创建从继承一个现有的视图类开始。通常情况下,我们可以从View类或者其子类如TextViewButton等开始继承。以下是创建一个简单自定义视图类的基本步骤:init();init();init();@Override。 阅读详情

相关推荐

构建Android的FloatingGroupExpandableListView自定义控件

随着移动应用需求的不断增长,用户界面(UI)的个性化和优化变得越来越重要。在Android平台中,开发者往往需要超越原生控件所提供的功能,进行自定义控件的开发,以满足特定的业务需求。自定义控件不仅能够提高应用的可用性和交互性,还能增强用户体验(UX)的连贯性。自定义控件开发涉及对现有控件的修改和新控件的创建。开发者可以通过继承和扩展Android系统提供的控件类,利用Android SDK中的各种接口和组件,结合Java或Kotlin编程语言,实现具有特殊功能和风格的控件。

weixin_35294091的博客 981

自己定义适配器优化

自己定义适配器优化 简单原理 ListView.setAdapter(adapter); 该方法用来设置listView的适配器,ListView通过我们自己定义的适配器中geiView()方法获取到每次装载的布局和数据文件。我们在设置每次展示的布局就是在getView()方法中设置的。由...

weixin_30622181的博客 251

Seedance2.5本地部署指南:从环境配置到生产优化的完整实践

在 AI 内容生成领域,本地部署方案正逐渐成为开发者和技术团队关注的焦点。Seedance2.5 作为一款支持图像和视频生成的 AI 工具,其完全离线运行的能力解决了云端服务在数据隐私、使用成本和访问稳定性方面的痛点。对于需要处理敏感内容、频繁生成素材或希望完全掌控生成流程的技术人员来说,掌握本地部署方法具有实际价值。 本文将以 Seedance2.5 的本地部署为例,详细介绍从环境准备、依赖配置到运行验证的完整流程,同时深入分析关键参数配置、常见问题排查方法以及生产环境下的优化建议。通过实际部署过程,理解

weixin_33139275的博客 737

android自定义adapter怎么优化,Android ListView适配器(Adapter)优化方法详解

Android ListView的优化,在做Android项目的时候,在用到ListView 界面及数据显示,这个时候如果资源过大,对项目来说,用户体验肯定是不好的,这里就对如何优化做了详细介绍:Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么...

weixin_36352025的博客 367

AGV、RGV、四向车openTCS调度系统(三)车辆适配器解读,封装自己的适配器

AGV、RGV、四向车调度。理解适配器的整体作用,以及如何使用官方例子改造自己的适配器,

要这头发有何用 3613

癌症免疫治疗预测神器TIDE:从原理到实战(避坑指南)

本文详细解析了癌症免疫治疗预测工具TIDE的核心原理及实战应用。TIDE算法通过模拟肿瘤免疫逃逸的两种核心机制(T细胞功能障碍和排除),为临床决策提供精准预测。文章涵盖数据准备、标准化流程、网页工具操作指南及结果解读,帮助科研人员和临床医生避开常见误区,优化免疫治疗策略。

weixin_29309475的博客 200

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

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

Leo Wang的博客 968

【2023版】基于JT808/JT1078协议的车载视频监控平台开发实战-开源架构解析

本文详细解析了基于JT808/JT1078协议的车载视频监控平台开发实战,涵盖协议核心作用、开源架构设计、开发避坑指南及二次开发建议。重点介绍了JT1078协议在音视频传输中的优化方案,以及海量位置数据存储、高可用架构等关键技术点,为开发者提供全面的实战参考。

weixin_26965807的博客 237

Android自定义适配器

自定义适配器用来存储数据//将数据放到列表项布局中 public class MyAdapter extends BaseAdapter {//数据集合 private List < Lufei > data;//列表项id private int layout_id;//上下文 private Context context;//构造方法 public MyAdapter(Context context , List < Lufei > data , int layout_id) {

qq_52108058的博客 3292

使用Clumsy和Process Explorer定位软件高CPU占用问题

使用弱网模拟工具Clumsy和进程查看工具Process Explorer定位软件高CPU占用问题。

dvlinker的技术专栏 5709

2026年迈瑞医疗嵌入式岗位面试题集(含参考答案)

文章摘要 本文总结了嵌入式开发面试中的30道题目,涵盖7大模块:嵌入式硬件与底层驱动、C/C++语言基础、操作系统与多线程编程、网络通信协议、数据结构与算法、开发工具与调试能力、综合素养与职业认知。重点解析了I²C通信协议的工作原理、速率选择及异常排查方法;USB的报文协议与四种传输类型及其适用场景;硬中断与软中断的区别及设计注意事项;字节序的概念与处理方法;以及C++中static和const关键字的核心作用。内容深入实用,适用于嵌入式开发者的技术提升与面试准备。

Open 53

Android 自定义适配器

/自定义适配器//定义视频区构造器,放控制器和数据//数组的长度 通过list 的size方法得到长度(有多少条数据)@Override//点击了那条数据@Override// //点击了那条数据的id@Override@Override//获取视图//获取所有的样式//给样式填数据//数据源//定义Lis数组放Product对象的数据。

weixin_51461336的博客 834

基于STM32F4XX 、HAL库的SHT40-CD1B-R3温湿度传感器驱动应用C语言程序设计

define SHT40_ADDR_READ 0x8B // CD1B 读地址 ((0x45 << 1) + 1)#define SHT40_ADDR_WRITE 0x8A // CD1B 写地址 (0x45 << 1)// 初始化 I2C1 (根据 CubeMX 生成的函数)// 湿度: -6%RH + 125%RH * (raw / 2^16)// 温度: -45°C + 175°C * (raw / 2^16)// 返回值: 0=成功, 1=失败(CRC错误或I2C通信错误)

PP_Cottage的博客 237

Android滚动列表RecyclerView

Android滚动列表RecyclerView 1. app gradle dependencies { implementation 'androidx.recyclerview:recyclerview:1.1.0' 2. activity布局 MainActivity <?xml version="1.0" encoding="utf-8"?> <LinearLayout...

greatyoulv的专栏 623

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

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

Android必学-异步加载

此文,仅做为个人学习Android,记录成长以及方便复习!本次是通过JSON获取页面数据,异步加载填充ListViewJSON地址:http://www.imooc.com/api/teacher?type=4&amp;num=30由于图片加载相对比较麻烦,首先第一步实现加载JSON中的标题和内容填充ListView由于需要访问网络所以需要在清单文件(AndroidManifest.xml)中添加...

qqazl001的博客 540

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android学习笔记 十七 再谈ListView

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于手机屏幕尺寸的原因

skdhfdfc的博客 131

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android开发--异步加载

因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示、本地数据可持续化存储、网络数据请求、性能优化等等,安卓和IOS开发都要考虑这些架构的模块。所以,熟悉IOS的开发的人,再去学习一下安卓的开发以及安卓的开发模式,你会发现很多技术和思想安卓和IOS是一样的,只是可...

weixin_33910434的博客 285

第一次作业

第一步,导入水果列表的代码。然后打开Fruit.java,添加变量:private String text;和private String time;分别的评论部分和显示时间的部分。添加Source-Generate Constructor using Fields,确定;再添加Getter、Setter方法。 第二步,这个时候系统会报错,打开MainActivity.java,修改in

xiaohuo777的博客 417

实验五 ListView 水果列表

本篇作实验报告,自留。

ZL_1205的博客 5019

Android Material Drawer Template性能优化:RecyclerView适配器高效实现

Android Material Drawer Template是一个基于Material Design的导航抽屉模板,其核心功能是通过RecyclerView实现流畅的侧边栏导航体验。本文将深入探讨如何优化该模板中的RecyclerView适配器实现,提升界面响应速度和滚动流畅度。 ## 为什么RecyclerView适配器优化至关重要? 在Android应用开发中,RecyclerView

gitblog_00356的博客 1126

Android入门——适配器(Adapter)

今天我要和大家聊的是有关于适配器的一些问题,BaseAdater适配器;今天主要是了解一下关于数组适配器(ArrayAdapter)、简单适配器(SimpleAdapter)、自定义适配器这三大类。 适配器顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等。适配器就像显示器,把复

sinat_23965981的专栏 501

Android自定义适配器---实现简单文件管理器

一、适配器Adapter         现实生活中的适配器就是一种“转化器”,将两个不兼容的事物做一个连接。Android在视图显示和后台数据上使用适配器,顾名思义,就是把一些数据给变得适当,适合以便于在View上显示。可以看作是界面数据绑定的一种理解。它所操纵的数据一般都是一些比较复杂的数据,如数组,链表,数据库,集合等。         适配器在视图与数据之间扮演了一个桥梁的作用,它将数

ljheee的博客 5390

安卓适配器类中怎么调用intent_JavaScript 设计模式 —— 适配器模式

简介:适配器模式是将一个类(对象)的接口(方法或属性)转化为使用这个类的“客户”所期望的另外一种接口(方法或属性),适配器模式使得提供接口的类和使用这个类的“客户”从不兼容而变得兼容个人理解:服务使用方将为了适应服务提供方而产生的数据处理逻辑抽离,而封装出一个新的类(适配器),适配器输入原有服务提供方的接口,输出服务使用方可以接受的接口。好处:使得数据处理的逻辑从服务接收方中抽离,简化其逻辑。使得...

weixin_39692830的博客 275

Android适配器Adapter的写法

在《Android第一行代码》的第三章,遇到了ListView和RecyclerView两个十分复杂的控件,完整的一个ListView和RecyclerView需要书写4部分代码:ListView和RecyclerView的整体布局,适配器类型类,ListView和RecyclerView的子布局,适配器。其中,适配器的写法和优化比较复杂。一、ListView适配器的一般写法public class

BruthYU的博客 2139

流放之路Build定稿不用进游戏:PoB离线构建与DPS模拟完整指南

Path of Building(PoB)是一款专为流放之路玩家打造的离线构建工具。你不需要打开游戏客户端,就能在电脑上完成被动技能树的加点推演、装备词缀的数值模拟,以及 DPS 的逐层叠乘估算——适合赛季开荒前把 Build 方案一次性定稿的场景。 ## 赛季开荒前,你到底在愁什么? 被动树几千个节点,词缀组合成千上万,进游戏后再一个个试,时间根本不够用。PoB 把这套推演搬到了桌面端:树文

gitblog_01083的博客 430
上一篇: Android 解决异步任务下载图片错位问题
下一篇: Android optionsMenu,菜单的使用
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值