android约束布局充值页面,Android学习之RecylerView实习仿支付宝充值界面

今天周末,闲来无事,做了一个仿支付宝充值界面,主要知识点用RecylerView的GridlayoutManager布局管理器,实现不同数据类型,填充不同布局,功能包括单击选中,双击取消,支持可输入金额等。

首先来看一下设计图

a6fe4466916298421770e37e0c7b7776.png

ok,首先我们来分析一下功能

主体部分实现是由recylerview来实现,因为考虑到扩展性,所以一般都不会用xml来实现主体界面,支持点击选中,再次点击取消选中。

采用RecylerView的GridlayoutManager布局管理器,分三列,这些都类似于GridView,不作解释,难点在于(adapter如何实现两种布局),因为还包含了可输入的EditText。

哈哈,其实RecylerView早就解决了这个问题

分析完毕,下面来看实现方式吧。

添加依赖

//noinspection GradleCompatible

compile 'com.android.support:recyclerview-v7:24.0.0-alpha1'

这个根据自己SDK的版本号进行选择。

RecylerView的初始化

recyclerView.setHasFixedSize(true);

recyclerView.setLayoutManager(new GridLayoutManager(this, 3));

recyclerView.setAdapter(adapter = new DemoAdapter());

adapter.replaceAll(getData());

这里采用GridLayoutManager布局管理器,分三列。

数据填充

public ArrayList getData() {

ArrayList list = new ArrayList<>();

for (int i = 0; i < 8; i++) {

String count = i + "元";

list.add(new ItemModel(ItemModel.ONE, count));

}

list.add(new ItemModel(ItemModel.TWO, null));

return list;

}

这里是很有意思的地方,大家可以看出来集合里包含了两种不同类型的数据,ItemModel.ONE,ItemModel.TWO,通过不同的数据类型,我们可以选用不同的布局

@Override

public DemoAdapter.BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

switch (viewType) {

case ItemModel.ONE:

return new OneViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.one, parent, false));

case ItemModel.TWO:

return new TWoViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.two, parent, false));

}

return null;

}

这里对不同的viewType,采用不同的ViewHolder,这里是重点,大家揣摩一下。

adapter布局则是一个TextView,跟EditText。

然后如何实现点击选中状态呢?这需要看我们的Selecor啦

这里可以看出,对于不同的select,设置对应的shape,就能轻松实现选中效果。

那么如何实现只能单选的功能呢?因为我们充值只能选择一种金额。

这里我们需要分析一下。我们在点击一种金额,需要取消其他金额的选中状态。该怎么实现呢?

我们需要设置一个过去选中的位置(int),记为lastSelectIndex,暂且设置为-1.

private int lastPressIndex = -1;

获取当前选中的位置

int position=getAdapterPosition();

当我们再选中时,需要进行判断,当lastPressIndex==position时,就是双击取消选中状态,将lastPressIndex设置为-1.反之,将lastPressIndex==position。

很好理解吧,因为集合从0开始,设置完之后,我们需要

notifyDataSetChanged();

没错,这句话很重要,如果不刷新的话,下面的viewholder就不会重新赋值。

itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Log.e("TAG", "OneViewHolder: ");

int position = getAdapterPosition();

if (lastPressIndex == position) {

lastPressIndex = -1;

} else {

lastPressIndex = position;

}

notifyDataSetChanged();

}

});

根据lastPressIndex改变select的状态。

if (getAdapterPosition() == lastPressIndex) {

tv.setSelected(true);

tv.setTextColor(ContextCompat.getColor(itemView.getContext(), R.color.white));

} else {

tv.setSelected(false);

tv.setTextColor(ContextCompat.getColor(itemView.getContext(), R.color.blue_500));

}

嗯关键点就这么哆啦。效果图

7cfaab2f352a80626a75cdbeb2db3013.png

这里主要解释实现的难点,重点,就不一一贴代码啦。

另外在可能有人会问,当我点击充值的时候如何将选中状态的值从adapter传过来呢?

这里我就分析一下实现方法。

1,用广播的方式,选中的时候就发送广播,在主页面进行接收即可

2,用eventBus来实现传值。详情可以看我的博客

使用EvnetBus进行消息传递解析

使用EventBus进行数据传递解析

就这么多啦,附上代码下载链接

http://pan.baidu.com/s/1nvpeorR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/354011.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

DISCUZ插件微信支付宝充值积分69.220517最新版【收集免费】

DISCUZ应用中心成熟的微信支付宝积分充值插件&#xff0c;拥有大批使用的站长用户&#xff0c;稳定运行于用于各类站点&#xff0c;反馈优秀&#xff0c;收益丰厚&#xff1b; 一直被模仿&#xff0c;从未被超越。 DZ的积分体系功能已经十分强大&#xff0c;可以做很多事&…

Django对接支付宝实现支付宝充值金币功能示例

很多网站里都有金币、积分之类的虚拟货币&#xff0c;获取这些往往需要充值。那么问题来了&#xff0c;如何在Django中对接支付宝实现支付宝充值金币的功能呢&#xff1f;网上很多资料都是电商的&#xff0c;那些都会带有订单系统之类比较复杂&#xff0c;而充值金币功能不需要…

第9章集 合

文章目录 9.1 Java集合框架9.1.1 集合接口与实现分离9.1.3 迭代器9.1.4 泛型实用方法 9.2 集合框架中的接口9.3.1 链表9.3.2 数组列表9.3.3散列集9.3.4 树集9.3.5 队列与双端队列9.3.6 优先队列 9.4 映射9.4.1 基本映射操作9.4.2 更新映射条目9.4.3 映射视图9.4.4 弱散列映射9.…

MySQL数据库性能优化技巧介绍

MySQL是目前最流行和广泛使用的开源关系型数据库之一&#xff0c;随着数据量的增长和访问负载的提高&#xff0c;优化数据库性能变得至关重要&#xff0c;以确保系统能够高效地处理大量的并发请求。本文将记录一些MySQL数据库性能优化的技巧&#xff0c;提高数据库的运行效率&a…

基于kubesphere的k8s环境部署单点版本的rook-ceph

文章目录 前言一、rook-ceph是什么&#xff1f;二、开始部署1.环境准备2.软件包准备3.下载rook-ceph文件4. 部署operator5.创建ceph集群6.创建工具容器&#xff0c;检查集群状态7.准备dashboard的nodeport端口映射服务8.准备prometheus的metric端口映射服务 总结 前言 基于kub…

记录使用Echarts-gl实现3D地图

一、前言 最近项目需要做个大屏展示的&#xff0c;开始做了第一版用户觉得地图太过于单调了&#xff0c;给我发了一个视频&#xff0c;让我参考着做。我看着视频上的地图旋转了方向、地图有标记、看着像是3D的&#xff08;视频上的地图使用多个图层叠加起来、CSS样式做了旋转&…

Warning: [antd: Menu] `children` will be removed in next major version. Please use `items` instead.

Warning: [antd: Menu] children will be removed in next major version. Please use items instead. andt 更新导致警告 https://ant.design/components/menu-cn/ 在 4.20.0 版本后&#xff0c;我们提供了 的简写方式&#xff0c;有更好的性能和更方便的数据组织方式&#x…

关于remove的用法

java中remove的用法要密切注意自己调用的remove()方法中的&#xff0c;传入的是int类型还是一个对象。 比如上面的程序&#xff0c;list1是一个长度为4的list&#xff0c;list2是1个长度为1的list&#xff0c;但是由于list2.get(0)是一个integer 对象&#xff0c;所以会直接删…

Spring中Bean初始化和销毁的多种方式

Spring中Bean初始化和销毁的多种方式 一、Bean的多种初始化方式1.PostConstruct注解2.实现InitializingBean接口3.声明init-method方法 二、Bean的多种销毁方式1.PreDestroy注解2.实现DisposableBean接口3.声明destroy-method方法 三、总结 Spring中支持在Bean的加载时声明初始…

LayaAir destroy 销毁与 removeChild 移除节点

目录 destroy 释放内存 编码示例 removeChild 移除节点 destroy 销毁节点 1、JavaScript 运行时无法启动垃圾回收器&#xff0c;要确保一个对象能够被回收&#xff0c;需要删除对该对象的所有引用。Sprite 提供的 destory() 方法会帮助设置对象内部引用为 null。 2、例如…

Javascript removeChild()不能删除全部子节点的解决办法

在Javascript中&#xff0c;只提供了一种删除节点的方法&#xff1a;removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法&#xff1a; parent.removeChild(thisNode) 参数说明&#xff1a; 参数 说明 thisNode 当前节点&#xff0c;即要删除的节点 parent 当…

CSDN 每日一练用例数据缺失了怎么办?

CSDN 每日一练用例数据缺失了怎么办&#xff1f; 引子1、用例与结果不匹配2、阅读理解困难3、用例数据缺失 用例数据缺失&#xff0c;却有人 AC &#xff1f;神奇的 c28761 津津的储蓄计划70093 近视的小张 小结最后的吐槽 引子 老顾最近几个月经常在 CSDN 举办的周赛上浑水摸…

Spring中bean的初始化和销毁几种实现方式详解

关联博文&#xff1a;Spring中Bean的作用域与生命周期 Bean的生命周期 &#xff1a; 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – …-- 销毁前操作 – 销毁方法的调用。 先放一张图吧。 【1】init-method和destroy-me…

js-removeChild()

下面给大家介绍Javascript removeChild()删除节点的方法&#xff0c;具体详情如下所示&#xff1a; 在Javascript中&#xff0c;只提供了一种删除节点的方法&#xff1a;removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法&#xff1a; parent.removeCh…

删除节点removeChild()

removeChild() 方法从子节点列表中删除某个节点。如删除成功&#xff0c;此方法可返回被删除的节点&#xff0c;如失败&#xff0c;则返回 NULL。 语法: nodeObject.removeChild(node) 参数: node &#xff1a;必需&#xff0c;指定需要删除的节点。 我们来看看下面代码&a…

Js removeChild、addChild

1. <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>添加删除记录练习升级</title><link rel"stylesheet" type"text/css" href"ex_2_style/css.css&qu…

【注意】js 里面 removeChild 使用的坑

这有坑啊&#xff0c;使用removeChild 循环删除 子元素们的时候 是【0】而不是【i】 这是因为 你每次删完一个 子元素们的 下标就会发生改变 比如 allSpan【0】 allSpan【1】 removeChild(allSpan【0】) 以后 &#xff0c;allSpan【1】 就不再是 allSpan【1】了&#xff0c;…

关于removeChild() 方法

removeChild() 方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a; JS 撰写时间&#xff1a;2021/7/8 注意红色箭头指向内容&#xff0c;本文将分为6张图片&#xff0c;并按从上到下顺序操作 1.我们先简…

4.C++多线程-- unique_lock(类模板)

1.unique_lock 1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard 2. unique_lock 也可以使用----std::adopt_lock 3.使用adopt_lock&#xff0c;之前要先使用lock. 4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒 std::this_thread:…