首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在android中动态添加和删除不同的viewholders (比如2个viewholders)?

在Android中动态添加和删除不同的ViewHolders可以通过RecyclerView来实现。RecyclerView是Android提供的一个强大的视图容器,用于展示大量数据集合,并支持灵活的布局和交互。

要动态添加和删除不同的ViewHolders,首先需要创建不同的ViewHolder类来适配不同的布局。通常情况下,我们会创建一个基类ViewHolder,然后派生出不同的子类ViewHolder来适配不同的布局。

以下是一个示例代码,演示如何在Android中动态添加和删除两个不同的ViewHolders:

  1. 首先,在布局文件中定义RecyclerView:
代码语言:xml
复制
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  1. 创建两个不同的ViewHolder类,分别用于不同的布局:
代码语言:java
复制
public class ViewHolder1 extends RecyclerView.ViewHolder {
    // ViewHolder1的布局元素
    public TextView textView1;

    public ViewHolder1(View itemView) {
        super(itemView);
        textView1 = itemView.findViewById(R.id.textView1);
    }
}

public class ViewHolder2 extends RecyclerView.ViewHolder {
    // ViewHolder2的布局元素
    public TextView textView2;

    public ViewHolder2(View itemView) {
        super(itemView);
        textView2 = itemView.findViewById(R.id.textView2);
    }
}
  1. 创建一个RecyclerView.Adapter类来管理数据和ViewHolder:
代码语言:java
复制
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final int VIEW_TYPE_1 = 1;
    private static final int VIEW_TYPE_2 = 2;

    private List<Object> dataList;

    public MyAdapter(List<Object> dataList) {
        this.dataList = dataList;
    }

    @Override
    public int getItemViewType(int position) {
        // 根据位置返回不同的布局类型
        if (dataList.get(position) instanceof Object1) {
            return VIEW_TYPE_1;
        } else if (dataList.get(position) instanceof Object2) {
            return VIEW_TYPE_2;
        }
        return super.getItemViewType(position);
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 根据布局类型创建不同的ViewHolder
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == VIEW_TYPE_1) {
            View view1 = inflater.inflate(R.layout.item_layout_1, parent, false);
            return new ViewHolder1(view1);
        } else if (viewType == VIEW_TYPE_2) {
            View view2 = inflater.inflate(R.layout.item_layout_2, parent, false);
            return new ViewHolder2(view2);
        }
        return null;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        // 根据位置绑定数据到对应的ViewHolder
        if (holder instanceof ViewHolder1) {
            Object1 object1 = (Object1) dataList.get(position);
            ViewHolder1 viewHolder1 = (ViewHolder1) holder;
            viewHolder1.textView1.setText(object1.getData());
        } else if (holder instanceof ViewHolder2) {
            Object2 object2 = (Object2) dataList.get(position);
            ViewHolder2 viewHolder2 = (ViewHolder2) holder;
            viewHolder2.textView2.setText(object2.getData());
        }
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }
}
  1. 在Activity或Fragment中使用RecyclerView和Adapter:
代码语言:java
复制
public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private MyAdapter adapter;
    private List<Object> dataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        dataList = new ArrayList<>();
        // 添加数据对象到dataList中,可以是Object1或Object2的实例

        adapter = new MyAdapter(dataList);
        recyclerView.setAdapter(adapter);
    }

    // 动态添加一个ViewHolder1
    private void addViewHolder1() {
        Object1 object1 = new Object1("Data for ViewHolder1");
        dataList.add(object1);
        adapter.notifyItemInserted(dataList.size() - 1);
    }

    // 动态添加一个ViewHolder2
    private void addViewHolder2() {
        Object2 object2 = new Object2("Data for ViewHolder2");
        dataList.add(object2);
        adapter.notifyItemInserted(dataList.size() - 1);
    }

    // 动态删除最后一个ViewHolder
    private void removeLastViewHolder() {
        if (dataList.size() > 0) {
            dataList.remove(dataList.size() - 1);
            adapter.notifyItemRemoved(dataList.size());
        }
    }
}

通过调用addViewHolder1()addViewHolder2()removeLastViewHolder()方法,可以动态添加和删除不同的ViewHolders。

这样,就实现了在Android中动态添加和删除不同的ViewHolders的功能。根据实际需求,可以根据不同的布局类型创建不同的ViewHolder,并通过RecyclerView.Adapter来管理数据和ViewHolder的绑定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

RecyclerView面试宝典:7大高频问题解析,面试必备!

Android开发领域,RecyclerView是展示动态数据列表强大工具,凭借其灵活性高性能,成为了面试热门话题。...特点:它们主要用于动画处理,移动动画或者删除动画,因为RecyclerView可以直接访问这些ViewHolders,而无需通过Adapter重新创建。...与AttachedScrap不同,这些ViewHolders已经从RecyclerView彻底分离,但是它们数量有限制,默认是2个。...避免在迭代期间修改集合:如果可能,避免在遍历集合循环中直接修改集合。如果需要修改,可以先标记需要添加删除项,在迭代完成后统一处理。...改善动画效果:在数据集发生变化时(添加、移除、移动等),如果开启了稳定ID,RecyclerView可以更准确地识别定位变化项,从而产生更平滑动画效果。

14500

31 天,从浅到深轻松学习 Kotlin

它们每个都以不同方式降低了可见性。 Day 2:Elvis 操作符 需要处理代码空值?可以使用 elvis 操作符,避免您 “空情况” (null-erplate)。...Day 14:在没有迭代器情况下迭代类型 迭代器用在了有趣地方!Android KTX 将迭代器添加到 viewGroup sparseArray。...您也可以将 sealed 类用在 RecyclerView adapter ,非常适合于 ViewHolders —— 用一组干净类型明确地分派给每个持有者。...使用 RecyclerViews,如果我们有很多来自 RecyclerView item 回调,比如一个点击,分享删除 item 项目,我们可以使用 sealed 类。...第三周学习小结: 本周主要讨论一些基本 Kotlin 特性,运算符重载,内联,运算符重载,懒加载,以及非常强大 inLine,并展示了使用 Android KTX 处理内容值,捆绑包回调时如何编写更简洁代码

2.2K30

Android 基础面试常常吊死在这几个问题上……

Android面试常常吊死问题 1、面试官:Context它是什么,有什么用? 2、面试官:什么是Armv7? 3、面试官:为什么字节码不能在Android运行?...Standard:它在启动 Activity 任务创建 Activity 新实例。可以创建 Activity 多个实例,并且可以将多个实例添加到相同或不同任务。...例如,当需要加载手机很多图片并要求拿到各种信息时,照片尺寸等,或读取非常大 Json 文件时候,应该放到子线程操作,当处理完毕后,通知主线程继续执行任务!...ViewHolder模式:Recyclerview实现了ViewHolders模式,但在ListView 不是必需。RecyclerView 在滚动时回收并重用单元格。...RecyclerView 将列表与其容器分离,因此可以通过设置LayoutManager在运行时轻松地将列表项放在不同容器(linearLayout,gridLayout)

2K20

Scudo到底是什么东西

一、简介 官方解释 Scudo 是一个动态用户模式内存分配器(也称为堆分配器),旨在抵御与堆相关漏洞(基于堆缓冲区溢出、释放后再使用重复释放),同时保持性能良好。...它提供了标准 C 分配取消分配基元( malloc free),以及 C++ 基元( new delete)。 看完之后如果没看懂,没关系,我们继续看。 二、Scudo到底是什么?...问题1:malloc是哪个库实现? 问题2:malloc是怎么实现? 2.1、malloc是哪个库实现? 当然就是我们说libc.so这个动态库,不同平台libc.so实现都不一样。...方法1:直接删除bionic/libc/Android.bpproduct_variables: libc_scudo_product_variables libc_scudo_product_variables...} 方法2:对应项目的mk文件添加MALLOC_SVELTE := true 因为MALLOC_SVELTE 最后影响还是malloc_not_svelte,本质方法1是一样,只是这样子做只会影响到某个项目

3K40

Android性能优化来龙去脉总结

[1.png] 看不清大图,下文会有拆解 一 首先,我们先了解一下都有哪些性能问题 -------------------- [2.png] 1、内存泄露。...所以了解一下inSampleSize,或者,如果图片归你们上传管理,你可以借助万象优图,他为你做了剪切好不同尺寸图片,这样省得你在客户端做图片缩放了。...因此在2016年,iOSAndroid都基于Cassowary算法来研发了属于自己布局系统,这里是ConstraintLayout与传统布局RelativeLayout,LinearLayout实现时性能对比...view过度绘制问题可以说是我们在写布局时候遇到一个最常见问题之一,可以说写着写着一不留神就写出了一个过度绘制,通常发生在一个嵌套viewgroup比如你给他设置了一个不必要背景。...a、对于列表item操作,比如对item点赞,此时不应该让整个列表刷新,而是应该只刷新这个item,相比对于熟练使用recyclerView你,应该明白如何操作了,不懂请看这里,你将会明白什么叫做

1.6K141

Android短视频系统开发技巧:给Button点击上色

在短视频系统开发UI设计,按钮一般都会有多个状态,比如:聚焦、点击等,不同状态必须显示不同呈现形式(比如颜色、形状改变),这样用户才能感觉到按钮被成功选中、点击了,否则用户体验就会非常差了。...本篇文章就简单地描述一下短视频系统开发,如何动态改变Button状态切换时背景。 短视频系统开发UI设计,默认情况下,系统会为Button点击实现一个默认背景切换。...如图所示: 但是,如果想为短视频系统开发Button添加自定义图片背景,android:background="@drawable/upload" 那么,当你点击Button时候会发现,...ImageButton也可以采用这种方法来自定义Button点击背景颜色切换效果,不过要注意为ImageButton添加一个android:padding属性,使得src图片与Button边界有一定距离...android:background="@drawable/button_selector"/> 效果如图: 这篇文章就写到这儿了,本文主要描述了如何在短视频系统开发时,为Button点击动态改变背景

1.2K10

何在Android Studio下进行NDK开发

NDK作用有很多,我们简单列举两个,比如: 1.首先NDK可以帮助开发者“快速”开发C(或C++)动态库。 2.其次,NDK集成了“交叉编译器”。...IntelAMDCPU 。 MIPS架构:多用在网关、猫、机顶盒等设备。 若想在使用了基于x86架构CPU操作系统上编译出可以在基于arm结构CPU操作系统上运行代码,就必须使用交叉编译。...3.配置好NDK后,简单为我们项目布局文件添加一个TextView一个Button,当点击Button时候,我们通过调用底层自己写好C/C++代码来返回一个字符串,最后呈现在TextView上...这里说一下,在我们进行NDK开发时候,选择用C还是C++,在编写代码时候除了CC++基本语法不同外,还是有许多不同地方需要注意。我们后续会慢慢介绍。这里先默认跟着我步骤来。 ?...Android Studio3.0,报出这个错误很可能原来版本AS不同,以前出现类似错误时候,我们解决方案一般都是在gradle.properties添加一行这样代码:android.useDeprecatedNdk

1.3K30

从0系统学Android--4.1探究碎片

Activity 很像,同样都能包含布局,同样有生命周期。 如何利用平板屏幕空间呢?比如我们要开发一个新闻类 APP。在手机端可以是这样。...比如在 Fragment 嵌套 Fragment ,如果你使用是系统内置 Fragment 则在 Android 4.2 系统之前设备上运行程序会崩溃。...运行结果: 4.2.2 动态添加碎片 在上一节我们学习了如何在布局添加碎片,下面我们来学习如何用代码动态添加碎片。 新建一个 another_right_fragment <?...这里仅需要放入一个碎片,不需要任何定位,因此非常适合使用 FrameLayout 下面在代码向 FrameLayout 添加内容,从而实现动态添加碎片功能。...动态添加碎片主要分为 5 步: 创建待添加碎片 获取 FrgmentManager ,FragmentManager是一个抽象类,在 Activity 通过 getSupportFragmentManager

63320

Android入门教程 | Fragment 基础概念

如要在 Activity 执行片段事务(添加、移除或替换片段),则必须使用 FragmentTransaction API。...也可使用 FragmentManager 打开一个 FragmentTransaction,通过它来执行某些事务,添加移除片段。...一旦activity进入resumed状态(也就是running状态),你就可以自由地添加删除fragment了。...Fragment 可以轻松得创建动态灵活 UI 设计,可以适应于不同屏幕尺寸。从手机到平板电脑。 Fragment 是一个独立模块,紧紧地与 activity 绑定在一起。...可以运行动态地移除、加入、交换等。 Fragment 提供一个新方式让你在不同安卓设备上统一你 UI。 Fragment 解决 Activity 间切换不流畅,轻量切换。

3.5K40

MTK Android平台开发流程

</string 其中com.android.wallpaper/.nexus.NexusWallpaper,”/”前为包名,后为类名 备注:如果要将内置到系统无sourcecode第三方动态壁纸程序设置为默认动态壁纸...如果修改了资源文件,res/values/string.xml文件内容,那么如何编译生效?...,以原有的3套theme为例子来参考即可,您需要为新添加theme-res-xxx准备相应资源 Android.mk/AndroidManifest.xml等文件 2、在alps/build/target...、androidsdktools目录下draw9patch.bat 33.如何去掉状态栏标题栏 修改对应Activity,添加以下代码: finalWindowwin=getWindow();..._20130123.pdf 43.如何在activity控制屏幕点亮与关闭 Android通过各种Lock锁对电源进行控制,需要注意是加锁和解锁必须成对出现。

2.9K40

使用Android模拟器预览调试程序

Android模拟器同样具有强大调试能力,例如能够记录内核输出控制台、模拟程序中断(比如接受 短信或打入电话)、模拟数据通道延时效果遗失。...下面的章节将提供关于模拟器详细信息,以及如何在开发应用程序中使用模拟器。 操作模拟器 你可以通过模拟器启动选项控制台命令来控制模拟环境行为特性。...这里你可以选择列表一个设备,也可以点击“Create New Enulator”按钮创建一个新虚拟设备,不同型号(屏幕尺寸、Android系统版本)。...如果APP成功编译通过,会在新打开窗口中看到类似如下界面: 我是为程序添加了一个按钮,添加了点击事件响应程序,可以直接通过鼠标点击屏幕按钮触发事件。...发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除

2K20

Android P Beta!您想要知道所有更新内容都在这里

请 点击访问此网站 了解支持本次体验全部设备,以及如何在这些设备上安装 Android P Beta。想要为 Android P Beta 开发应用,请 点击访问此网站。...在 Android P ,我们 DeepMind 合作推出了一个全新功能,即动态电量管理 (Adaptive Battery),来优化各个应用电量使用。...· Slices App Actions 一同到来新功能还有 Slices,这个功能可以让您应用以模块化、富交互形式插入到多个使用场景比如 Google Search Assistant...通过 Android Vitals 积累下来成果,Android 可以识别那些过度消耗电量行为,滥用唤醒锁定等。...马上开始在您喜欢设备上体验 Android P Beta 吧,欢迎您向我们反馈意见建议!并请继续关注 Project Treble 最新动态

1K50

关于Android架构,你是否还在生搬硬套?

3.2 Android视图开发可以借鉴函数式编程思想 1. 模块化意义何在?...数据逻辑:这部分是大家常说业务逻辑,属于强业务逻辑,比如根据不同用户类型获取不同数据、展示不同界面,加上Data Mapper一系列操作其实就是给后端兜底,帮他们补全剩余逻辑而已。...控制反转概念设计原则依赖倒置很相似,只是少了一个依赖抽象。...引入diff之前: RecyclerView想要实现动态删除添加、更新需要分别手动更新数据UI,这样在中间插了一道并且分别更新数据UI已经违背了前面所说数据驱动UI,而我们想要是不管删除添加或者更新只有一个入口...引入diff之后: Diff算法通过对oldItemnewItem做差异化比对,会自动更新改变item,同时支持删除添加动画效果,这一特性解决了RecyclerView需要实现数据驱动UI性能问题

84110

Gradle依赖管理解析

你可能想创建自己依赖库,这样你就可以在没有将其发布到公有或私有仓库时在多个项目中复用。在这种情况下,你不能使用任何在线资源,而是必须通过其他方式来添加依赖。...文件放置在libs 文件夹,其会自动包含在构建路径最终APK 。...依赖项目通常应用项目类似。你可以使用相同任务来构建和测试依赖项目,并且它们可以有不同构建variants。不同之处在于输出。...②使用.aar 文件 如果你创建了一个依赖库,并且想在不同Android 应用复用,那么你可以创建一个.aar 文件,然后将其作为一个依赖添加到你项目中。...1 配置 有时可能你不得不和一个只在特定设备上工作SDK 打交道,比如特定厂商蓝牙SDK。为了能够编译该代码,你需要将SDK 添加至编译类路径。

2K20

六个小技巧帮你瘦身Android APK

Android应用大小对用户体验应用性能至关重要。大型APK文件会增加应用安装时间,启动时间页面加载时间,降低了用户体验。因此,APK瘦身是Android开发重要任务。...资源分析工具:使用资源分析工具,AndroGuard来识别未使用资源文件。 分包动态交付 Android应用支持分包动态交付功能,这意味着应用可以根据需要下载额外功能模块。...资源替代密度限制 Android允许应用为不同屏幕密度配置提供不同资源文件。只加载所需资源文件可以减小APK文件大小。...压缩工具:使用APK压缩工具,APKTool来手动优化APK文件,删除未使用资源。 结论 APK瘦身是Android应用开发关键任务,可以提高应用性能用户体验。...从资源优化、代码优化、清理无用资源到分包动态交付,以及资源替代密度限制,都是APK瘦身不同层面。

42720

无处安放业务逻辑使你在Android架构上吃了多少生硬亏,是否还在生搬硬套?

3.2 Android视图开发可以借鉴函数式编程思想 一、模块化意义何在?...数据逻辑:这部分是大家常说业务逻辑,属于强业务逻辑,比如根据不同用户类型获取不同数据、展示不同界面,加上Data Mapper一系列操作其实就是给后端兜底,帮他们补全剩余逻辑而已。...引入diff之前: RecyclerView想要实现动态删除添加、更新需要分别手动更新数据UI,这样在中间插了一道并且分别更新数据UI已经违背了前面所说数据驱动UI,而我们想要是不管删除添加或者更新只有一个入口...引入diff之后: Diff算法通过对oldItemnewItem做差异化比对,会自动更新改变item,同时支持删除添加动画效果,这一特性解决了RecyclerView需要实现数据驱动UI性能问题...基础(★★) 面向对象思想 多态 异常处理 数据类型 Java IO 集合 Java 多线程 Java 高级(★★) Java 反射 Java 动态代理 Java 设计模式&回收机制

1.6K00

安卓usb调试模式还是无法连接_android usb

USB调试是一种模式,允许Android连接计算机以进行数据同步或刷新任何文件等。本教程详细介绍如何为各种品牌Android设备不同版本Android操作系统启用USB调试。...一 如何在不同品牌Android手机上启用USB调试 由于Android手机品牌多种多样,因此在这里我们仅列出国内最受欢迎Android手机品牌,包括华为,OPPO,ViVO,小米,魅族向您展示如何调试...二 如何在不同Android版本上启用USB调试模式 不同安卓系统启用USB调试模式方法不同,根据自己设备系统版本选择适合方法进行调试。...根据上述方法启用USB调试模式后,您可以轻松地在Android手机上传输Android数据或恢复已删除照片,视频,消息或其他数据。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除

2.3K30
领券