RecyclerView 实现瀑布流的正确姿势「建议收藏」

RecyclerView 实现瀑布流的正确姿势「建议收藏」首先来看一下瀑布流效果:加载的数据根据自己需求自己定义。来说一下具体实现:privateRecyclerViewrlv;privateFlashApaptermAdapter;//设置layoutManagerStaggeredGridLayoutManagermanager=newStaggeredGridLayoutManager(2,Stagger…

大家好,欢迎来到IT知识分享网。

首先来看一下瀑布流效果:

RecyclerView 实现瀑布流的正确姿势「建议收藏」

加载的数据根据自己需求自己定义。

来说一下具体实现:

private RecyclerView rlv;

private FlashApapter mAdapter;

//设置layoutManager
StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
//解决item跳动
manager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
rlv.setLayoutManager(manager);

mAdapter = new FlashApapter (this,datas);

rlv.setAdapter(mAdapter);

下面看下FlashAdapter的具体实现:

public class FlashAdapter extends RecyclerView.Adapter<FlashAdapter.MyHolder> {

    private Context context;
    private List<VideoBean> flashlyBeans;
    private int baseWidth = 0;
    private flashCallBack mCallBack;

    public FlashAdapter(Context context, List<VideoBean> flashlyBeans, flashCallBack mCallBack) {

        this.context = context;
        this.flashlyBeans = flashlyBeans;
        this.mCallBack = mCallBack;
        int screenWidth = TCommonUtils.getScreenWidth(context);
        baseWidth = screenWidth/2;
    }

    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = View.inflate(context, R.layout.item_flashly, null);
        return new MyHolder(view);
    }

    @Override
    public void onBindViewHolder(MyHolder holder, int position) {

        VideoBean bean = flashlyBeans.get(position);
        Glide.with(context)
                .load(bean.getImgUrl()).dontAnimate()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .placeholder(R.drawable.bg_theme)
                .into(holder.mIvImg);

        if (mCallBack != null) {

            holder.itemView.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {

                    int index = (int) v.getTag();
                    mCallBack.onItemClick(index);
                }
            });
        }
    }

    @Override
    public int getItemCount() {

        return flashlyBeans.size();
    }

    public class MyHolder extends RecyclerView.ViewHolder {

        @BindView(R.id.iv_img)
        ImageView mIvImg;

        public MyHolder(View itemView) {

            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public interface flashCallBack {

        void onItemClick(int position);
    }
}

这时我们的基本实现完成了,然后运行,效果并不是瀑布流。郁闷。

然后我们发现,我们需要给每个item设置一个高度,这个高度不是固定的。

RecyclerView 实现瀑布流的正确姿势「建议收藏」

然后再运行,瀑布流效果是实现了。但是由于页面是分页加载,当我们上拉加载更多后,然后再回到顶部,发现顶部item有留白和位置跳动的问题,还是郁闷。

问题到底出在哪里?

答案是这样的,当我们上拉加载更多后,调用了 mAdapter.notifyDataSetChanged(),进行了整个页面的刷新,这样就会重新计算图片高度,造成布局错乱。那既然这样,我们不要重新加载布局。换成

mAdapter.notifyItemInserted(prePosition + 1),从数据变化的地方加载新布局。

这样就解决了留白和位置跳动问题。

最后总结一下:瀑布流效果关键有两点:第一、给图片设置不同的高度,并保存下来;第二、加载更多时,从新增数据开始的位置开始加载,不要notifyDataChanged,而是notifyItemInserted(position+1)。

 

 

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10132.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信