分享

SuitedRecyclerView 一个根据自身大小自适应的 RecyclerView,自定义了 LayoutManag @codeKK Android 开源站

 點點滴滴 2017-06-05
小技巧 1:可通过键盘方向键或字母键 awsd、nl 快速查看前后项目哦

SuitedRecyclerView

简介:一个根据自身大小自适应的 RecyclerView,自定义了 LayoutManager
更多:作者   提 Bug   示例 APK   
标签:

最基本的用法

  • RecyclerView 的设置

      mPhotosAdapter = new PhotosAdapter(list, this);
      recyclerView.setAdapter(mPhotosAdapter);
      //自定义 LayoutManager
      SuitedLayoutManager layoutManager = new SuitedLayoutManager(mPhotosAdapter);
      recyclerView.setLayoutManager(layoutManager);
      //设置最大的图片显示高度,默认为 600px
      layoutManager.setMaxRowHeight(getResources().getDisplayMetrics().heightPixels / 3);
      //设置 Item 之间的空隙
      recyclerView.addItemDecoration(new SuitedItemDecoration(DisplayUtils.dpToPx(4.0f, this)));
    
  • PhotosAdapter 需要实现 SizeCaculator.SizeCalculatorDelegate 接口里的 aspectRatioForIndex(int position)方法,返回图片宽高比

    @Override
    public double aspectRatioForIndex(int position) {
      if (position < getItemCount()) {
          PhotoInfo info = mPhotos.get(position);
          //如果你的图片 url 是以 _w750_h750.jpg 这样的格式结尾,可以用 SuitUrlUtil 这个工具类获取它的宽高比
          double ratio = SuitUrlUtil.getAspectRadioFromUrl(info.photo);
          return ratio;
      }
      return 1.0;
    } 

内存的优化使用

由于这个 LayoutManager 会根据自身宽高和相邻图片宽高的比率最后计算出每张图片的大小,所以每张图片大小几乎都不一样,recyclerView 里 View 的复用情况很少,这种情况下如果不对图片进行等比缩小和对滑动做优化,将会造成严重的卡顿。

在我个人实践的过程中呢,有两处优化的点可以让图片滑动时更为流畅。

  • 在 ImageView 确定 Width 和 Height 后,再进行网络请求,具体可参考 library 里的 SuitImageView 的做法

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
          super.onSizeChanged(w, h, oldw, oldh);
          if(w != 0 && h != 0) {
              Picasso.with(getContext()).load(mPhoto).tag(getContext()).resize(w,h).into(this);
        }
    
  • 滑动过程中,中断图片请求,以使用 Picasso 框架请求图片为例:

      recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
          @Override
          public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
              super.onScrollStateChanged(recyclerView, newState);
              if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                  Picasso.with(PhotoActivity.this).resumeTag(PhotoActivity.this);
              } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                  Picasso.with(PhotoActivity.this).pauseTag(PhotoActivity.this);
              } else if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
                  Picasso.with(PhotoActivity.this).pauseTag(PhotoActivity.this);
              }
          }
      });
    

Demo 的滑动效果

下拉刷新上拉加载更多框架修改自WaveSwipeRefreshLayout开源库

License Apache 2.0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多