搜索
热搜: 活动 交友 discuz
查看: 3561|回复: 0
打印 上一主题 下一主题

【转】RecyclerView实现瀑布流遇到的各种问题

[复制链接]

160

主题

165

帖子

814

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
814
跳转到指定楼层
楼主
发表于 2017-6-29 10:52:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
来源 :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));


  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.         private void resizeItemView(ImageView frontCoverImage, float scaleType) {
  27.                 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();
  28.                 params.width = screenWidth / 2;
  29.                 params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);
  30.                 frontCoverImage.setLayoutParams(params);
  31.         }<pre name="code" class="java">private void resizeItemView(ImageView frontCoverImage, float scaleType) {
  32.                 LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frontCoverImage.getLayoutParams();
  33.                 params.width = screenWidth / 2;
  34.                 params.height = (int) (params.width / scaleType) - Utils.dp2px(context, 8);
  35.                 frontCoverImage.setLayoutParams(params);
  36.         }
复制代码

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

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

解决方法:


  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(0, 0, 0, 0);
  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就不会重绘


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|安卓论坛  

GMT+8, 2024-4-29 16:47 , Processed in 0.057457 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Design S!|ƽ̶

快速回复 返回顶部 返回列表