如何仅检查RecyclerView中的可见项目

时间:2017-03-22 07:12:38

标签: android

我调用了一个API并在RecyclerView中加载了一个数据列表。现在,用户单击任何一个项目,然后打开一个新页面。在这个新页面中,我正在调用一个能够获取数据的新API。我的问题是,如果互联网速度太慢,则需要花费太多时间才能加载。所以我想尝试优化性能。 我不知道哪种逻辑最好。

我正在尝试一种逻辑。当用户滚动到第一页(Recycler视图)时。我将调用详细信息页面API和预加载数据并将其保存在本地db(sqlite)中。因此,当我点击任何项目时,将打开详细信息页面并检查本地是否有数据。如果本地有数据,它将在本地显示。所以我认为它应该更快。

因此,为了应用上述逻辑,我将不得不在Recycler视图中仅显示可见项目时调用API。所以我使用 addOnScrollListener ,但它多次调用。我只需要将其称为用户可见的项目。如果有3个项目可见,那么它应该被呼叫一次,但是它正在多次呼叫并且api正在多次呼叫。

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                    if (dy < 0) {
                        // Recycle view scrolling up...

                    } else if (dy > 0) {
                        // Recycle view scrolling down...
                        int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                        int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
                        int findLastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                        int findLastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();

                        Log.e("","firstVisiblePosition ="+firstVisiblePosition
                                +"\nfindFirstCompletelyVisibleItemPosition ="+findFirstCompletelyVisibleItemPosition
                                +"\nfindLastVisibleItemPosition ="+findLastVisibleItemPosition
                                +"\nfindLastCompletelyVisibleItemPosition ="+findLastCompletelyVisibleItemPosition);

                        // here many times it is checking in locally.
                        //check locally has data
                        //if yes
                        //Call API.

                    }
                }
            });

1 个答案:

答案 0 :(得分:0)

我相信,对于你想要解决的问题,可能会过于频繁地调用“滚动”。尝试检查LayoutManager中的回调,因为

  

LayoutManager负责测量和定位RecyclerView中的项目视图,以及确定何时回收用户不再可见的项目视图的策略。

可能会检查这些回调是否适合您onItemsAddedonLayoutChildren或onAddFocusables ...我无法发布3个链接=(