Android StaggeredGridLayoutManager布局RecyclerView在滚动状态可见范围刷新数据

标签: android
33人阅读 评论(0) 收藏 举报
分类:

Android StaggeredGridLayoutManager布局RecyclerView在滚动状态可见范围刷新数据


之所以把StaggeredGridLayoutManager布局的RecyclerView单列出来处理滚动状态下可见(可视)范围内的数据更新问题,是因为在StaggeredGridLayoutManager布局下的RecyclerView,对于第一个可视item和最后一个可视item,即第一个可视item位置和最后一个可视item位置,不像在LinearLayoutManager布局下直接获取,需要进行一个简单计算。关键的计算过程我写在了getOutRange()方法内。

package zhangphil.recyclerview;

import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Arrays;

public class RecyclerViewActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private RecyclerViewAdapter mAdapter;
    private StaggeredGridLayoutManager layoutManager;
    private ArrayList<String> mItems;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.recycler_view_activity);

        mItems = new ArrayList<>();
        for (int i = 0; i < 110; i++) {
            mItems.add(i + "");
        }

        initRecyclerView();

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);

                if (recyclerView.getScrollState() == RecyclerView.SCROLL_STATE_IDLE) {
                    int[] outRange = getOutRange();
                    int len = outRange[1] - outRange[0] + 1;

                    int num = (int) (Math.random() * 10);
                    for (int i = 0; i < len; i++) {
                        mItems.set(outRange[0] + i, num + "");
                    }

                    mAdapter.notifyDataSetChanged();
                }
            }
        });
    }

    private int[] getOutRange() {
        int[] range = new int[2];

        int[] first = new int[layoutManager.getSpanCount()];
        layoutManager.findFirstVisibleItemPositions(first);

        int[] last = new int[layoutManager.getSpanCount()];
        layoutManager.findLastVisibleItemPositions(last);

        range[0] = first[0];

        Arrays.sort(last);
        range[1] = last[last.length - 1];

        return range;
    }

    private void initRecyclerView() {
        mRecyclerView = findViewById(R.id.recycler_view);
        layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        mRecyclerView.setLayoutManager(layoutManager);

        mAdapter = new RecyclerViewAdapter();
        mRecyclerView.setAdapter(mAdapter);
    }

    private class RecyclerViewAdapter extends RecyclerView.Adapter<MyVH> {

        @NonNull
        @Override
        public MyVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
            return new MyVH(view);
        }

        @Override
        public void onBindViewHolder(@NonNull MyVH holder, int position) {
            holder.text1.setText("" + position);
            holder.text2.setText(mItems.get(position));
        }

        @Override
        public int getItemCount() {
            return mItems.size();
        }
    }

    private class MyVH extends RecyclerView.ViewHolder {
        public TextView text1;
        public TextView text2;

        public MyVH(View itemView) {
            super(itemView);
            text1 = itemView.findViewById(android.R.id.text1);
            text1.setTextColor(Color.WHITE);
            text1.setBackgroundColor(Color.RED);
            text2 = itemView.findViewById(android.R.id.text2);
            text2.setTextColor(Color.DKGRAY);
        }
    }
}

代码实现一个简单意图,用StaggeredGridLayoutManager控制RecyclerView,当RecyclerView滚动停止后,更新可可范围内的数据到最新。

如图:



查看评论

RecyclerView采用StaggeredGridLayoutManager布局的瀑布流效果

recyclerView瀑布流实现
  • zhangfei8625
  • zhangfei8625
  • 2016-07-14 16:58:48
  • 4584

Recycle获取第一个可见条目(包括瀑布流)位置以及getChildAt(position)

获取RecyclerView中的控件之踩坑篇 发表于 2016-10-14   |   分类于 Android开发   |   1条评论 前言 RecyclerView跟随Andro...
  • HiGson
  • HiGson
  • 2016-10-14 21:58:43
  • 4553

RecyclerView 瀑布流的配置以及它的 StaggeredGridLayoutManager 布局管理器的使用

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • qq_35980005
  • qq_35980005
  • 2017-10-11 20:16:28
  • 253

RecyclerView和StaggeredGridLayoutManager实现瀑布流向下滑动item跳动、留白的问题

由于项目需要最近第一次采用RecyclerView和StaggeredGridLayoutManager实现了瀑布流,原本以为官方的东西不会有什么问题,但是好事多磨,实现了以后上拉加载更多,都没有问题...
  • Vitktory
  • Vitktory
  • 2017-07-19 17:31:01
  • 1115

使用StaggeredGridLayoutManager实现交错式网格布局

一直在想着怎么描述这样的布局,毕竟用的是瀑布流的布局管理器,但是呢效果基本就是个网格布局,只是每列之间是上下错开的,还是觉得叫交错式网格布局吧。先看个效果。 效果看起来应该很好实现的。这里仅仅是...
  • friendlychen
  • friendlychen
  • 2017-08-03 16:43:15
  • 3503

RecyclerView 获取滑动停止时展示出的item范围

RecyclerView 获取滑动停止时展示出的item范围
  • humorousz
  • humorousz
  • 2017-03-15 10:56:41
  • 1200

Android RecyclerView 真正的布局刷新的正确方式

在平时使用RecyclerView时,当想进行布局刷新时,我们通常会调用notifyItemChanged(int positon)进行布局刷新,如果item中图片的话,那么刷新就会出现闪烁,这是怎么...
  • qq402164452
  • qq402164452
  • 2016-12-05 13:03:22
  • 9009

android RecyclerView GridLayoutManager 滚动后导致第一行消失

正常显示效果 上线滑动列表,最后滑动到最上面,即顶部,发生异常,第一条数据消失了,如下图 代码设置如下: 当采用第一种方法的时候,如下代码: if (posit...
  • qq_21445563
  • qq_21445563
  • 2017-12-06 16:41:06
  • 154

Recycler上拉加载--适配GridLayoutManager和StaggeredGridLayoutManager

当Recycler中需要下拉刷新的时候。就想自己实现一下。 发现LinearLayoutManager时,体验完美。但是,到了GridLayoutManager和StaggeredGridLayout...
  • wang8651971
  • wang8651971
  • 2016-03-11 15:09:25
  • 9985

Android RecyclerView的StaggeredGridLayoutManager和CardView

 《Android RecyclerView的StaggeredGridLayoutManager和CardView》 StaggeredGridLayoutManager,顾名思义,”交错排...
  • zhangphil
  • zhangphil
  • 2015-08-13 09:05:35
  • 5772
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 175万+
    积分: 2万+
    排名: 395
    关于我
    邮箱: zhangphil@live.com
    博客专栏
    最新评论