哎~~~~~~~~ ,一言难进啊,老板已经拖欠工资两个月了,马上就要过中秋了,还不发工资,愁死个人了。每天没有心情些项目了,闲的没事,研究研究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还有惊喜哟【于是你就想起了七宗罪】,就问你一句话,屌不屌?【好吧 也就那么回事】
装逼完毕,立马走人,我屮艸芔茻,还不发工资