我有一个图库应用程序,它正在解析 Reddit API 并用图像填充 recyclerview 列表。每页包含 25 张来自该 Reddit 子版 block 的图片。但是此代码会进行重复的数据调用,当您滚动 2 或 3 次时,它会在获得下一页之前将相同的页面放入图库中。我该如何解决这个问题?
public class DesktopGalleryFragment extends Fragment{
private int count;
private RecyclerView mDesktopRecyclerView;
private List<DesktopItems> mList = new ArrayList<>();
private String after, nullString;
private Parcelable recyclerViewState;
public String getAfter(String s){
return this.after = s;
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setRetainInstance(true);
new FetchItemsTask().execute(nullString);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
mDesktopRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState){
PhotoAdapter adapter = (PhotoAdapter) recyclerView.getAdapter();
int lastPostion = adapter.getLastBoundPosition();
GridLayoutManager layoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
int loadBufferPosition = 1;
if (lastPostion >= adapter.getItemCount() - layoutManager.getSpanCount() - loadBufferPosition){
new FetchItemsTask().execute(after);
}
}
});
return v;
}
private class FetchItemsTask extends AsyncTask<String, Void, List<DesktopItems>>{
@Override
protected List<DesktopItems> doInBackground(String... params){
return new RedditParser().fetchItems(params[0]);
}
@Override
protected void onPostExecute(List<DesktopItems> items){
if (count > 1){
getAfter(DesktopItems.getAfter());
mList.addAll(items);
mDesktopRecyclerView.getAdapter().notifyDataSetChanged();
} else{
mList = items;
recyclerViewState = mDesktopRecyclerView.getLayoutManager().onSaveInstanceState();
mDesktopRecyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);
setupAdapter();
}
count++;
}
}
}
RedditParser.java
public List<DesktopItems> fetchItems(String after)
{
List<DesktopItems> items = new ArrayList<>();
int count = 0;
int counter = count + 25;
try
{
String url = Uri.parse("https://www.reddit.com/r/battlestations/hot.json")
.buildUpon()
.appendQueryParameter("after", after)
.build()
.toString();
String jsonString = getUrlString(url);
Log.i(TAG, "Received JSON: " + jsonString);
JSONObject jsonBody = new JSONObject(jsonString);
parseItems(items, jsonBody);
return items;
}
最佳答案
由于 onScrollStateChanged
的工作方式,您会收到对 FetchItemsTask
的重叠调用。如果您向上滑动并让事情解决,则调用 onScrollStateChanged
的方式如下:
onScrollStateChanged:SCROLL_STATE_DRAGGING
onScrollStateChanged:SCROLL_STATE_SETTLING
onScrollStateChanged:SCROLL_STATE_IDLE
这正是您所期望的。但是,如果您向上滑动,然后在 View 稳定之前再次向上滑动,则会发生以下情况:
onScrollStateChanged:SCROLL_STATE_DRAGGING
onScrollStateChanged:SCROLL_STATE_SETTLING
onScrollStateChanged:SCROLL_STATE_DRAGGING
onScrollStateChanged:SCROLL_STATE_SETTLING
onScrollStateChanged:SCROLL_STATE_IDLE
乍一看这可能令人惊讶,但如果您仔细考虑一下,就会发现它是有道理的。
您也没有对 onScrollStateChanged
中的 newState
进行任何检查。
如果您正在尝试实现无尽的RecyclerView
,请尝试搜索“endless recyclerview”。网络上有很多好的资源。
关于java - RecyclerView使用AsyncTask分页制作重复页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42854142/