打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SuitedRecyclerView 一个根据自身大小自适应的 RecyclerView,自定义了 LayoutManag @codeKK Android 开源站
小技巧 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

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
你可能误会了!原来自定义LayoutManager可以这么简单
你想知道的关于RecyclerView的秘密都在这里
玩转仿探探卡片式滑动效果
安卓开发笔记(十):升级ListView为RecylerView的使用
RecyclerView和ListView使用对比分析
掌握自定义LayoutManager之实现流式布局
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服