Android中Recyclerview使用13----实现瀑布流遇到的各种问题(item移动,加载更多图片闪烁,以及定制各种类型Header和Footer)

转载地址:http://blog.csdn.net/windows771053651/article/details/51596744

功能:图片瀑布流

问题1:如何保持已显示过的imageview的尺寸

解决方法:定义一个HashMap<Integer, Float> indexMap = new HashMap<Integer, Float>();用来保存已显示过的ImageView尺寸,显示时直接取其比例即可

代码:onBindItemView(),调用resizeItemView(itemViewHolder.frontCoverImage, getScaleType(position));

[java]  view plain  copy
  1. private float getScaleType(int position) {  
  2.         if (!indexMap.containsKey(position)) {  
  3.             float scaleType;  
  4.             if (hasHeader()) {  
  5.                 if (position == 1) {  
  6.                     scaleType = SIZE_SCALE_01;  
  7.                 } else if (position == 2) {  
  8.                     scaleType = SIZE_SCALE_02;  
  9.                 } else {  
  10.                     scaleType = Utils.getRandomInt() % 2 == 0 ? SIZE_SCALE_01 : SIZE_SCALE_02;  
  11.                 }  
  12.             } else {  
  13.                 if (position == 0) {  
  14.                     scaleType = SIZE_SCALE_01;  
  15.                 } else if (position == 1) {  
  16.                     scaleType = SIZE_SCALE_02;  
  17.                 } else {  
  18.                     scaleType = Utils.getRandomInt() % 2 == 0 ? SIZE_SCALE_01 : SIZE_SCALE_02;  
  19.                 }  
  20.             }  
  21.             indexMap.put(position, scaleType);  
  22.         }   
  23.           
  24.         return indexMap.get(position);  
  25.     }  
  26.   
  27.     private void resizeItemView(ImageView frontCoverImage, float scaleType) {  
  28.         LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();  
  29.         params.width = screenWidth / 2;  
  30.         params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);  
  31.         frontCoverImage.setLayoutParams(params);  
  32.     }<pre name="code" class="java">private void resizeItemView(ImageView frontCoverImage, float scaleType) {  
  33.         LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();  
  34.         params.width = screenWidth / 2;  
  35.         params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);  
  36.         frontCoverImage.setLayoutParams(params);  
  37.     }  
 

以上解决了滑动过程中的item移动,但是RecyclerView滑动到顶部时仍会出现移动问题,这是由于item重用,并且要保持满屏造成的

问题2:RecyclerView滑动到顶部时仍会出现移动问题

解决方法:

[java]  view plain  copy
  1. final StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);  
  2.         //RecyclerView滑动过程中不断请求layout的Request,不断调整item见的间隙,并且是在item尺寸显示前预处理,因此解决RecyclerView滑动到顶部时仍会出现移动问题  
  3.         layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);  
  4.         mRecyclerView.setLayoutManager(layoutManager);  
  5.         mRecyclerView.addItemDecoration(new DividerGridItemDecoration(getContext()));  
  6.         mRecyclerView.setPadding(0000);  
  7.         mRecyclerView.addOnScrollListener(new OnScrollListener() {  
  8.             @Override  
  9.             public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
  10.                 super.onScrollStateChanged(recyclerView, newState);  
  11.                 layoutManager.invalidateSpanAssignments();  
  12.             }  
  13.         });  


以上解决了item移动的各种问题

问题3:瀑布流加载更多用notifyDataSetChanged()刷新图片闪烁

原因:notifyDataSetChanged()会导致整个itemview刷新,已经测试:相同position刷新其itemview是不同的对象,例如,刷新后,position为12的用了position为13的itemview,再次刷新时,又用了position为10的itemview,这样次position上对应的itemview的ImageView就会在重设size时发生闪烁,此现象是可以用肉眼看到的。

解决方法:

用notifyItemRangeInserted()进行局部刷新,这样原先的itemview就不会重绘

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值