简单实现仿某宝地址选择三级联动样式
- 內(nèi)容簡(jiǎn)單介紹
- 實(shí)現(xiàn)步驟
- 第一步 找準(zhǔn)方向
- 第二步 開干
- 總結(jié)
- 還是題外話
內(nèi)容簡(jiǎn)單介紹
簡(jiǎn)單看一下須要實(shí)現(xiàn)的效果,如圖:
實(shí)現(xiàn)步驟
第一步 找準(zhǔn)方向
事實(shí)上就是想好要用recyclerview而不是listview。假設(shè)要問我recyclerview是什么的話。
。
第二步 開干
首先須要先在xml里放置這么個(gè)控件
<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>這里我加了一個(gè)背景,背景也能夠在它的父布局加,主要是作為動(dòng)畫的時(shí)候以下的顏色(顏色為一種灰色)。
然后。須要編寫每一個(gè)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>注意這里的每一個(gè)item的背景我都設(shè)置成了白色。這種話就能和背景色區(qū)分開。
接下來(lái)須要編寫adapter了,也就是recycler的adapter,這里比較關(guān)鍵:
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);}}}關(guān)鍵部分為onBindViewHolder()這種方法,在這里為itemview加入動(dòng)畫并播放,這里還有個(gè)小貓膩,就是怎么來(lái)推斷是向上滑還是向下滑呢。這里我是依據(jù)position的添加或降低情況來(lái)推斷的,沒想到有什么其它的更加完美的方法。
這樣,我們?cè)谏侠臅r(shí)候來(lái)加入動(dòng)畫并播放。adapter完畢,接下來(lái)給recyclerview set上:
好的。這時(shí)候效果基本上已經(jīng)出來(lái)了,可是還有點(diǎn)小瑕疵。由于沒有間距。說好的像listview一樣的間距呢。我表示不會(huì),于是各種百度google。大神們說重寫ondraw方法就好了。我想了一下。我僅僅是要個(gè)間距而已,難道間距須要用畫的么?于是我想了個(gè)可能是最簡(jiǎn)單的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;//構(gòu)造方法中傳入要設(shè)置的間距高度}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {outRect.set(0,0,0,height);//最關(guān)鍵的一步。在這里加間距。height為間距的高度} }這個(gè)東西叫做RecyclerView.ItemDecoration,當(dāng)中重寫的getItemOffsets看名字是來(lái)拿到item的偏移量的,由于假設(shè)畫了分隔線的話那item肯定會(huì)有偏移的嘛,假設(shè)我不畫切割線,僅僅偏移呢。那不就是傳說中的間距么。
。
ok,就一句話:
outRect.set(0,0,0,height);然后給recycler放上唄:
recyclerview.addItemDecoration(new LinearLayoutManagerDivider(dp2px(1))); recyclerview.setHasFixedSize(true);由于我們是固定大小的,所以加上setHasFixedSize(true)這種方法來(lái)提高我們的效率。
好了到這里全部的效果就已經(jīng)實(shí)現(xiàn)了。
總結(jié)
兩個(gè)事,一動(dòng)畫。二間距。動(dòng)畫能夠加在onBindViewHolder方法里,并且動(dòng)畫效果能夠疊加。間距呢,剛才的方法outRect.set()方法。四個(gè)參數(shù)各自是left。top。right,bottom,不用我說這回也知道這種方法以后該怎么理解了
還是題外話
曾經(jīng)一直沒有認(rèn)真研究recyclerview,由于認(rèn)為listview已經(jīng)非常強(qiáng)大了。基本滿足工作中的全部需求了,并且看網(wǎng)上的博客也好還是demo也好,總感覺這玩楞真復(fù)雜。太難了。可是咱要始終是要進(jìn)步啊,所以就抽時(shí)間看了看官方文檔,發(fā)現(xiàn)也沒有自己想象中的那么難。并且當(dāng)初看到這個(gè)效果的時(shí)候首先想到的是在github上的一個(gè)庫(kù),這里的基本思路也是參考這個(gè)recyclerview-animators這個(gè)庫(kù)非常方便。可是美中不足的是不能實(shí)現(xiàn)上圖中那種僅僅有上拉的時(shí)候有動(dòng)畫,在下拉的時(shí)候沒有動(dòng)畫,所以才有了小弟的這種方法。
總結(jié)
以上是生活随笔為你收集整理的简单实现仿某宝地址选择三级联动样式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android中怎么保存checkbox
- 下一篇: [技巧] 论文自动更新参考文献序号