哎~~~~~~~~ ,一言難進啊,老闆已經拖欠工資兩個月了,馬上就要過中秋了,還不發工資,愁死個人了。每天沒有心情些項目了,閒的沒事,研究研究recycleview,麻蛋,這玩意出了那麼長時間了,我還不太瞭解!! 今天跟recycleview相個親,以後慢慢相處,拿下······ 然後,嘿嘿嘿 你懂得。
之前瞭解過recycleview,看到好多炫酷的效果,哇曬,真特麼炫(沒錯,老子就是這麼膚淺)。今天上手親自用了用,媽嘞,各種坑。(還好我個子高,還能爬出來)廢話不多說,【好像是說了不少····】
recycleview七宗罪:
第一罪:
使用
View view = View.inflate(mActivity,R.layout.item_view,parent);
能生出個兒子:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
view跟佈局控件初始化,以前總喜歡用View.inflate.
listview裏面用這個從來就沒懷過孕,用recycleview後,還是用這個,好傢伙,一下子就生了個bug。我明明itemview的xml中使用的是matchparent,可是出來的界面卻是個很窄的recycleview,雖然不短吧,但你這也太細了吧,用起來很不爽啊。然後問度娘後,才知道,先人也曾生過bug【看來出軌的不只我一個】,解決辦法:
使用LayoutInflater.from().inflate(R.layout.item_recycleview_list, parent, false);[注意加粗]
具體原因:前人種樹後人摘花—-看這裏http://blog.csdn.net/overseasandroid/article/details/51840819第二罪:
itemview 的根佈局會被加載進去【如果height是match_parent,recycleView的item高度就是全屏】
反正呢listview是我以前的正室,人家那根佈局的屬性不會影響到itemview,可是你recycleview作爲一個新來的二房,就是不一樣,不過我喜歡。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="#002200"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/bt_item"
android:text="@string/app_name"
/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:id="@+id/tv_item"
android:text="@string/app_name"
android:gravity="center"
android:textSize="15sp"
android:textColor="#000000"
android:textStyle="bold"
/>
</LinearLayout>
這樣的佈局在listview裏面,顯示出來後itemview高度是不會填充listview高度的,recycleview卻會···
- 第三罪: 關於remove的坑坑
沒出孃胎的小雞崽都知道listview裏面刪除item的話,直接從數據list中刪除後,notifydatasetchanged就KO了
當然在recycleview中用notifydatasetchanged 也是ko,木問題的。
可是總有些孩子喜歡裝逼,當然爲了漂亮炫酷麼,使用了notifyItemRemoved,於是乎,就傻逼了【產生數據刪除錯亂和超出索引異常導致崩潰。 】。
因爲函數裏面的傳入的參數position,它是在進行onBind操作時確定的,在刪除單項後,已經出現在畫面裏的項不會再有調用onBind機會,這樣它保留的position一直是未進行刪除操作前的postion值。
【像我這種牛逼的大神怎麼可能自己去研究,翻滾吧,小野貓—》》原文:http://blog.csdn.net/wangkai0681080/article/details/50082825】
so 你們懂得:
什麼?還要我再說一遍,嗯嗯嗯 好本大神就再重複一遍。
三種方法:
1.別裝逼,老老實實用notifydatasetchanged,【UI說:這樣不好看;剷平經理說:這樣用戶體驗不 好;——》那就跟着我學裝逼吧】
2.非要裝
裝逼第一式: 使用getAdapterPosition或者getLayoutPosition–》》
strList.remove(holder.getAdapterPosition());
RecyStaggeredGridAdapter.this.notifyItemRemoved(holder.getAdapterPosition());
裝逼第二式:刪除notify後,重繪調用notifyItemRangeChanged
RecyStaggeredGridAdapter.this.notifyItemRemoved(position);
RecyStaggeredGridAdapter.this.notifyItemRangeChanged(position,strList.size()-1);
第四············好吧 ,畢竟以後還要朝夕相處,我就說說她的好:
首先:
比listview更加溫柔:
recycleview.setLayoutManager(參數);此方法直接將listview,gridview,還有神馬瀑布流融合一體。
new LinearLayoutManager(mActivity, LinearLayout.VERTICAL, false);
可以橫着劃,豎着劃(VERTICAL和HORIZONTAL);倒着劃,正着劃(false和true);
new GridLayoutManager(mActivity,1, GridLayout.HORIZONTAL,true)
表格佈局,1是控制一行或一列顯示多少個itemview;
new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL);
同上
關於setLayoutManager這個方法
(new LinearLayoutManager(mActivity, LinearLayout.VERTICAL, false);
裏面有 三個參數
第一個不用多說,
第二個也不用多說,就是橫向和縱向,【哎呦不錯哦,這個很recycleview】
第三個,什麼鬼?
此參數是控制list排序和顯示的,
如果list裏面是12345,設置爲true,加載後是這個樣子的,而且是從底部往上滑
如果是false,加載後是介個樣紙的,正常的往下滑。
關於點擊item中button 修改item的ui問題。
綁定bean數據,進行notifydatesetchange,跟listview一樣一樣的。
牢記一點,因爲view是被複用的,所以不能直接去修改ui,我一般就是去修改數據,讓數據去填充ui
不過這一點recycleview比listview要好的多,因爲notifyItemChanged(),
而且還能加入動畫,使用notifyItemRemoved還有驚喜喲【於是你就想起了七宗罪】,就問你一句話,屌不屌?【好吧 也就那麼回事】
裝逼完畢,立馬走人,我屮艸芔茻,還不發工資