Recycleview淺而又淺的分析使用

哎~~~~~~~~  ,一言難進啊,老闆已經拖欠工資兩個月了,馬上就要過中秋了,還不發工資,愁死個人了。每天沒有心情些項目了,閒的沒事,研究研究recycleview,麻蛋,這玩意出了那麼長時間了,我還不太瞭解!!  今天跟recycleview相個親,以後慢慢相處,拿下······ 然後,嘿嘿嘿 你懂得。

之前瞭解過recycleview,看到好多炫酷的效果,哇曬,真特麼炫(沒錯,老子就是這麼膚淺)。今天上手親自用了用,媽嘞,各種坑。(還好我個子高,還能爬出來)廢話不多說,【好像是說了不少····】

recycleview七宗罪:
  1. 第一罪:

    使用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

  2. 第二罪:

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卻會···

  1. 第三罪: 關於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還有驚喜喲【於是你就想起了七宗罪】,就問你一句話,屌不屌?【好吧 也就那麼回事】

裝逼完畢,立馬走人,我屮艸芔茻,還不發工資

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章