StaggerdRecyclerView

android瀑布流,完美解决滑动过程中item位置错乱,下拉刷新顶部空白,加载更多顶部错乱等问题,还可以实现动画效果

效果图

集成

allprojects {repositories {...maven { url 'https://jitpack.io' }}}dependencies {        implementation 'com.github.moo611:StaggerdRecyclerView:latestversion'}

基本用法

1.布局文件里添加

<com.atech.staggedrv.StaggerdRecyclerView    android:id="@+id/str"    android:layout_width="match_parent"    android:layout_height="match_parent"/>

2.您的model,需要实现StaggedModel接口

//示例 examplepublic class FakeModel implements StaggedModel {     private int width;    private int height;    private int resourceId;    public FakeModel(int width, int height, int resourceId){        this.width = width;        this.height = height;        this.resourceId = resourceId;    }    @Override    public int getWidth() {        return width;    }    @Override    public int getHeight() {        return height;    }    @Override    public String getTitle() {        return null;    }    @Override    public String getThumb() {        return null;    }    @Override    public int localResorce() {        return resourceId;    }}

3.您的adapter,需要继承staggedadapter

  class MyAdapter<T extends StaggedModel> extends StaggedAdapter<T> {        MyAdapter(Context c) {            super(c);        }        @Override        public RecyclerView.ViewHolder addViewHolder(ViewGroup viewGroup, int i) {            //绑定自定义的viewholder            View v = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_item_layout,viewGroup,false);            return new MyHolder(v);        }        @Override        public void bindView(RecyclerView.ViewHolder viewHolder, int i) {            MyHolder myHolder = (MyHolder)viewHolder;            // 在加载图片之前设定好图片的宽高,防止出现item错乱及闪烁            ViewGroup.LayoutParams layoutParams = myHolder.img.getLayoutParams();            layoutParams.height = datas.get(i).getHeight();            myHolder.img.setLayoutParams(layoutParams);            myHolder.img.setImageResource(datas.get(i).localResorce());        }    }

4.您的viewholder,和recyclerview时的写法一样。

class MyHolder extends RecyclerView.ViewHolder{        ImageView img;        public MyHolder(@NonNull View itemView) {            super(itemView);            img = itemView.findViewById(R.id.img);        }    }

5.mainactivity

MyAdapter<FakeModel> staggedAdapter;StaggerdRecyclerView str;private List<FakeModel> datas = new ArrayList<>();...        str = findViewById(R.id.str);        staggedAdapter = new MyAdapter<>(this);        str.link(staggedAdapter,2);              str.addCallbackListener(new LoadMoreAndRefresh() {            @Override            public void onLoadMore() {                staggedAdapter.refresh(datas);//加载更多            }            @Override            public void onRefresh() {                staggedAdapter.loadMore(datas);//下拉刷新            }        });        refresh();...

其他功能

动画效果

str.addAnimation(R.anim.right_to_left);

设置间距

str.addDecoration(new GridItemDecoration(this,10));

禁止刷新

str.enableRefresh(false);

禁止加载更多

str.enableLoadMore(false);

原理

滑动时位置错乱

在Recyclerview滑动过程中,由于缓存复用机制,会对Item进行重绘, 如果不确定imageview的宽高,就会造成位置错乱和闪烁。

刷新时顶部留白

使用 notifyDataSetChanged()方法做刷新时,会触发StaggeredGridLayoutManager 的onItemsChanged 方法,导致item的spanIndex重现进行计算,item所在列的位置出现了变化,导致了顶部空白。而用notifyItemRangeInserted,notifyItemRangeChanged做局部刷新时则不会引起变化。

参考

https://www.jianshu.com/p/d34075c0f287

更多相关文章

  1. 它们的定义android滑动菜单
  2. Android(安卓)自定义 HorizontalScrollView 打造再多图片(控件)也
  3. Android滑动动画ViewFlipper简单使用
  4. Android加载长图之Scrollview嵌套ImageView
  5. Android中控制和禁止ScrollView自动滑动到底部的方法
  6. ViewFlipper 左右滑动效果
  7. Android引导页Splash设计
  8. 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效
  9. Flutter基本UI组件StatefulWidget与StatelessWidget(上)

随机推荐

  1. Android学习 之 活动与任务
  2. 一个RecyclerView列表显示多种类型的Item
  3. android程序界面自动适应屏幕分辨率例子
  4. Android(安卓)学习路线
  5. 自定义ViewGroup控件 textView 的ellipsi
  6. 已解决:android 模拟器调用本地的webservi
  7. Android(安卓)解析json对象,存放到List中
  8. Android(安卓)EditText 密码输入框可见性
  9. 携程Android(安卓)App插件化和动态加载实
  10. 一篇文章搞懂Handler发消息时,Handler,Mess