文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 13:42

关注

StaggerdRecyclerView

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

效果图

在这里插入图片描述

集成
allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
dependencies {
	        implementation 'com.github.moo611:StaggerdRecyclerView:latestversion'
	}
基本用法 1.布局文件里添加

2.您的model,需要实现StaggedModel接口
//示例 example
public 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 extends StaggedAdapter {
        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 staggedAdapter;
StaggerdRecyclerView str;
private List 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


作者:德松欧巴


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯