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

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

内容简单介绍

简单看一下须要实现的效果,如图:

实现步骤

第一步 找准方向

事实上就是想好要用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;
    }

    @Override
    public 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;
    }

    @Override
    public 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("辽宁");
    }

    @Override
    public 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;

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c,parent,state);
    }

    public LinearLayoutManagerDivider(int i) {
        super();
        height = i;//构造方法中传入要设置的间距高度
    }

    @Override
    public 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这个库非常方便。可是美中不足的是不能实现上图中那种仅仅有上拉的时候有动画,在下拉的时候没有动画,所以才有了小弟的这种方法。

原文地址:https://www.cnblogs.com/zhchoutai/p/8742913.html

时间: 2024-11-07 05:17:19

简单实现仿某宝地址选择三级联动样式的相关文章

vue仿淘宝地址选择组件

Vue组件:省市区地址选择组件 <template> <div v-show="addressSelectShow" :style="{'left': leftValue + 'px', 'top': topValue + 'px' }" class="content"> <ul class="area-select"> <li v-for="(item, index) in

小程序公共组件之地址选择五级联动

1 <!--components/area-select.wxmlby:张涛20180308--> 2 <view class="area-select-bg" wx:if="{{isShow}}"> 3 <view class="area-select-box"> 4 <view class="area-select-title"> 5 <view catchtap='_

地区选择-三级联动

1. city_pickers: ^0.0.1 import 'package:city_pickers/city_pickers.dart'; 2. class TabsPage extends StatefulWidget{ @override _TabsPageState createState() => new _TabsPageState(); } class _TabsPageState extends State<TabsPage> with SingleTickerPro

地区选择三级联动

html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="area.js"></script> </head> <body> <select name="&quo

地址的三级联动(原生js)

html: <select name="provlevel" id="provlevel" style="width: 120px;height:30px;"> <option>--请选择省份--</option></select><select name="citylevel" id="citylevel" style="width: 120

年月日下拉选择三级联动(闰年判断),时间获取方法总结,特殊:获取当前月天数

html 年:<select id="year"></select> 月:<select id="month"></select> 日:<select id="date"></select> js //获取当前时间 var MyDate = new Date(); //获取当前年 var yearNow = MyDate.getFullYear(); //获取当前月[月为0-

全国地区选择(三级联动)

1.新建HTML文件,引入必须的js文件. <script src="../js/jquery.min.js"></script> //自行引入 <script src="../js/Area.js"></script> <script src="../js/AreaData_min.js"></script> Area.js: 1 // 地址选择三级联动 2 $(funct

Android省市区三级联动滚轮选择(真实项目中提取出来的组件)

最近项目要做一个,类似淘宝手机客户端的,选择收货地址的三级联动滚动选择组件,下面是它的大致界面截图: 在IOS中有个叫UIPickerView的选择器,并且在dataSource中定义了UIPickerView的数据源和定制内容,所以用只要熟悉它的基本用法,要实现这么个三级联动滑动选择是挺简单的. 言归正传,今天讨论的是在Android里面如何来实现这么个效果,那么如何实现呢??? 相信部分童鞋首先想到的是android.widget.DatePicker和android.widget.Time

Android之省市区三级联动

最近项目要做一个电商APP,选择收货地址的三级联动滚动选择组件, 控件用起来非常简单 ,下面是它的运行效果: 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:su="http://schemas.android.com/apk/res-auto