简单实现仿某宝地址选择三级联动样式

  • 内容简单介绍
  • 实现步骤
    • 第一步 找准方向
    • 第二步 开干
  • 总结
  • 还是题外话

内容简单介绍

简单看一下须要实现的效果,如图:
这里写图片描写叙述

实现步骤

第一步 找准方向

事实上就是想好要用recyclerview而不是listview。假设要问我recyclerview是什么的话。

第二步 开干

首先须要先在xml里放置这么个控件

<android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/bg_main">
</android.support.v7.widget.RecyclerView>

这里我加了一个背景,背景也能够在它的父布局加,主要是作为动画的时候以下的颜色(颜色为一种灰色)。

然后。须要编写每一个item的布局,这里也非常easy,还是贴一下代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="1dp"android:background="@color/white"android:orientation="horizontal"><TextView
        android:id="@+id/tv"android:layout_width="0dp"android:layout_height="40dp"android:layout_weight="1"android:gravity="center_vertical"android:paddingLeft="5dp"android:text="辽宁"android:textColor="@android:color/black" /><ImageView
        android:layout_width="20dp"android:layout_height="20dp"android:layout_gravity="center_vertical"android:padding="3dp"android:src="@mipmap/ic_right" />
</LinearLayout>

注意这里的每一个item的背景我都设置成了白色。这种话就能和背景色区分开。

接下来须要编写adapter了,也就是recycler的adapter,这里比較关键:

public class CheckProvAdapter extends RecyclerView.Adapter<CheckProvAdapter.CheckProvViewHolder> {private Context context;private int i = 0;public CheckProvAdapter(Context context) {this.context = context;}@Overridepublic CheckProvViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View v = View.inflate(context,R.layout.item_check_prov,null);v.setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));CheckProvViewHolder viewHolder = new CheckProvViewHolder(v);return viewHolder;}@Overridepublic void onBindViewHolder(CheckProvViewHolder holder, int position) {if(position>i){//上滑ObjectAnimator.ofFloat(holder.itemView, "translationY", holder.itemView.getMeasuredHeight(), 0).setDuration(300).start();}else {//下滑}i=position;holder.tv.setText("辽宁");}@Overridepublic int getItemCount() {return 100;}public static class CheckProvViewHolder extends RecyclerView.ViewHolder {TextView tv;public CheckProvViewHolder(View itemView) {super(itemView);tv = (TextView) itemView.findViewById(R.id.tv);}}}

关键部分为onBindViewHolder()这种方法,在这里为itemview加入动画并播放,这里还有个小猫腻,就是怎么来推断是向上滑还是向下滑呢。这里我是依据position的添加或降低情况来推断的,没想到有什么其它的更加完美的方法。
这样,我们在上拉的时候来加入动画并播放。adapter完毕,接下来给recyclerview set上:

recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
recyclerview.setLayoutManager(new LinearLayoutManager(this));
recyclerview.setAdapter(new CheckProvAdapter(this));

好的。这时候效果基本上已经出来了,可是还有点小瑕疵。由于没有间距。说好的像listview一样的间距呢。我表示不会,于是各种百度google。大神们说重写ondraw方法就好了。我想了一下。我仅仅是要个间距而已,难道间距须要用画的么?于是我想了个可能是最简单的recylerview加间距的方法:

public class LinearLayoutManagerDivider extends RecyclerView.ItemDecoration {private int height;@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {super.onDraw(c,parent,state);}public LinearLayoutManagerDivider(int i) {super();height = i;//构造方法中传入要设置的间距高度}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {outRect.set(0,0,0,height);//最关键的一步。在这里加间距。height为间距的高度}
}

这个东西叫做RecyclerView.ItemDecoration,当中重写的getItemOffsets看名字是来拿到item的偏移量的,由于假设画了分隔线的话那item肯定会有偏移的嘛,假设我不画切割线,仅仅偏移呢。那不就是传说中的间距么。

ok,就一句话:

outRect.set(0,0,0,height);

然后给recycler放上呗:

recyclerview.addItemDecoration(new LinearLayoutManagerDivider(dp2px(1)));
recyclerview.setHasFixedSize(true);

由于我们是固定大小的,所以加上setHasFixedSize(true)这种方法来提高我们的效率。
好了到这里全部的效果就已经实现了。

总结

两个事,一动画。二间距。动画能够加在onBindViewHolder方法里,并且动画效果能够叠加。间距呢,刚才的方法outRect.set()方法。四个參数各自是left。top。right,bottom,不用我说这回也知道这种方法以后该怎么理解了

还是题外话

曾经一直没有认真研究recyclerview,由于认为listview已经非常强大了。基本满足工作中的全部需求了,并且看网上的博客也好还是demo也好,总感觉这玩楞真复杂。太难了。可是咱要始终是要进步啊,所以就抽时间看了看官方文档,发现也没有自己想象中的那么难。并且当初看到这个效果的时候首先想到的是在github上的一个库,这里的基本思路也是參考这个recyclerview-animators这个库非常方便。可是美中不足的是不能实现上图中那种仅仅有上拉的时候有动画,在下拉的时候没有动画,所以才有了小弟的这种方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opencv双目测距实现

虽然最近注意力已经不可遏制地被神经科学、大脑记忆机制和各种毕业活动吸引过去了&#xff0c;但是还是觉得有必要把这段时间双目视觉方面的进展总结一下。毕竟从上一篇博文发表之后&#xff0c;很多同仁发E-mail来与我讨论&#xff0c;很多原来的疑团&#xff0c;也在讨论和一…

Block的循环引用详解

1.首先我们创建了一个网络请求工具类 然后storyboard里面去创建了一个导航控制器 并且把它设置为初始控制器 然后拖入一个bar button &#xff0d;&#xff0d;show&#xff0d;&#xff0d;到自带的控制器 这个时候运行代码的结果是 x 显然这个时候没有造成循环引用 为什…

计算机视觉和图形学中的摄像机内参数矩阵详解

在计算机视觉和图形学中都有“摄像机内参数矩阵”这个概念&#xff0c;其含义大致相同&#xff0c;但在实际使用过程中&#xff0c;这两个矩阵却相差甚远。在增强现实中&#xff0c;为了使计算机绘制的虚拟物体和真实环境图像对其&#xff0c;需要令虚拟摄像机的内参数和真实摄…

数据库基础杂记

sql,Structured Query Language结构化查询语言。SQL 是一门 ANSI(美国国家标准局) 的标准计算机语言&#xff0c;用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。SQL 可与数据库程序协同工作&#xff0c;比如 MS Access、DB2、Informix、MS SQL Server、Ora…

基于RBGD的mapping

最近学习RGBD的SLAM&#xff0c;收集了两个RGBD的mapping的开源工具包 1.RGBDSlam2 a.安装方法&#xff1a; #准备工作空间 source /opt/ros/indigo/setup.bash mkdir -p ~/rgbdslam_catkin_ws/src cd ~/rgbdslam_catkin_ws/src catkin_init_workspace cd ~/rgbdslam_catkin_ws…

【瓜分5000元奖金】Wannafly挑战赛13

链接&#xff1a;https://www.nowcoder.com/acm/contest/80/A来源&#xff1a;牛客网 zzy的小号 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K64bit IO Format: %lld题目描述 学家zzy根据字体的特点&#…

20145217《网络对抗》 恶意代码分析

20145217《网络对抗》 免杀原理与实践 知识点学习总结 进行恶意代码分析之前必须具备以下知识&#xff1a;编程、汇编/反汇编、网络基本知识、PE文件结构以及一些常用行为分析软件。 一、在一个已经感染了恶意代码的机器上如何找到病毒文件&#xff1f; 找到恶意代码才能对其分…

cvRemap 对图像进行普通几何变换

cvRemap 对图像进行普通几何变换 函数 cvRemap 利用下面指定的矩阵变换输入图像:   dst(x,y)<-src(mapx(x,y),mapy(x,y))   与其它几何变换类似&#xff0c;可以使用一些插值方法&#xff08;由用户指定&#xff0c;同cvResize&#xff09;来计算非整数坐标的像素值 vo…

一篇需要膜拜的文篇--Javascript异步编程模型进化(转)

要我能用得这么熟&#xff0c; 那前端出师了哈。 http://foio.github.io/javascript-asyn-pattern/ 改天一个一个亲测一下。 Javascript语言是单线程的&#xff0c;没有复杂的同步互斥&#xff1b;但是&#xff0c;这并没有限制它的使用范围&#xff1b;相反&#xff0c;借助于…

CvMat,Mat和IplImage之间的转化和拷贝

1、CvMat之间的复制 //注意&#xff1a;深拷贝 - 单独分配空间&#xff0c;两者相互独立 CvMat* a; CvMat* b cvCloneMat(a); //copy a to b 2、Mat之间的复制 //注意&#xff1a;浅拷贝 - 不复制数据只创建矩阵头&#xff0c;数据共享&#xff08;更改a,b,c的任意一…

rtp协议详解/rtcp协议详解

、简介 目前&#xff0c;在IP网络中实现实时语音、视频通信和应用已经成为网络应用的一个主流技术和发展方向&#xff0c;本文详细介绍IP协议族中用于实时语音、视频数据传输的标准协议RTP&#xff08; Real-time Transport Protocol&#xff09;和RTCP&#xff08;RTP Control…

MVC开发中的常见错误-04-“System.NullReferenceException”类型的异常在 BBFJ.OA.WebApp.dll 中发生,但未在用户代码中进行处理...

未将对象引用设置到对象实例,又名空指针异常,伴随程序员开发的一生. 查看详细信息得知: SetUserRoleInfo() 首先想到的是 IBLL.IRoleInfoService RoleInfoService { set; get; }应该是config文件中反射出现了问题 <?xml version"1.0" encoding"utf-8"…

RTSP协议介绍

1. 实 时流协议RTSP RTSP[3]协 议以客户服务器方式工作&#xff0c;它是一个多媒体播放控制协议&#xff0c;用来使用户在播放从因特网下载的实时数据时能够进行控制&#xff0c;如&#xff1a;暂停/继 续、后退、前进等。因此 RTSP 又称为“因特网录像机遥控协议”。 1.1. …

mysql中出现没有权限访问或者查看全部数据库的问题---用客户端第一次打开的时候...

在my.cnf中mysqld目录下的socket/var/lib/mysql/mysql.sock一行下面添加skip_grant_tables---------------报错退出然后重新启动server mysqld restart 登录进去转载于:https://www.cnblogs.com/yecao8888/p/5661250.html

HALCON示例程序resistor.hdev通过不同焦距图像提取深度信息

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序resistor.hdev通过不同焦距图像提取深度信息 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 Names : [] dev_close_window () for i : 1 to 10 by 1 Names : [Names,‘dff/focus_’ (i$’.2’)…

优秀项目解析:区块链上的房地产交易

区块链前哨导语&#xff1a;买房租房中&#xff0c;需要了解多少知识从而规避欺诈风险&#xff1f;如果区块链这一新兴技术与房地产这个古老的概念相结合&#xff0c;会碰撞出怎样的火花&#xff1f;房地产物业的所有权验证与转让将呈现出怎样的面貌&#xff1f;美国有家科技初…

HALCON示例程序rim.hdev轮圈孔检测提取字符

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序rim.hdev轮圈孔检测提取字符 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 dev_update_off () dev_close_window () dev_open_window (0, 0, 768, 576, ‘black’, WindowID) set_display_font …

德国汽车厂发生机器人杀人事件 人机协作是大势所趋

OFweek机器人网讯&#xff1a;《金融时报》报道称&#xff0c;德国大众汽车制造厂中一个机器人杀死了一名人类工作人员。当时这名21岁的工人正在安装和调制机器人&#xff0c;后者突然“出手”击中工人的胸部&#xff0c;并将其碾压在金属板上。这名工人当场死亡。 调查人员正对…

HALCON示例程序sequence_diff.hdev通过两张连续图像进行车辆流量监控

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序sequence_diff.hdev通过两张连续图像进行车辆流量监控 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 Thresh : 35 dev_update_window (‘off’) dev_update_pc (‘off’) dev_update_var (‘of…

HALCON示例程序stamp_catalogue.hdev分割图片与文字

小哥哥小姐姐觉得有用点个赞呗&#xff01; HALCON示例程序stamp_catalogue.hdev分割图片与文字 示例程序源码&#xff08;加注释&#xff09; 关于显示类函数解释 gen_rectangle1 (Rect, 0, 0, 5, 5) dev_update_var (‘off’) dev_update_window (‘off’) dev_close_win…