我调用了一个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.
}
}
});
答案 0 :(得分:0)
我相信,对于你想要解决的问题,可能会过于频繁地调用“滚动”。尝试检查LayoutManager中的回调,因为
LayoutManager负责测量和定位RecyclerView中的项目视图,以及确定何时回收用户不再可见的项目视图的策略。
可能会检查这些回调是否适合您onItemsAdded,onLayoutChildren或onAddFocusables ...我无法发布3个链接=(