【问题标题】:RecyclerView Pagination Using AsyncTask Making Duplicate Pages?RecyclerView 分页使用 AsyncTask 制作重复页面?
【发布时间】:2017-03-17 09:47:47
【问题描述】:

我有一个画廊应用程序,它正在解析 Reddit API 并使用图像填充 recyclerview 列表。每页包含来自该 subreddit 的 25 张图片。但是这段代码会进行重复的数据调用,当您滚动 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;
}

【问题讨论】:

    标签: java android android-asynctask pagination android-recyclerview


    【解决方案1】:

    由于onScrollStateChanged 的工作方式,您收到对FetchItemsTask 的重复调用。如果您向上滑动并让事情解决,这就是 onScrollStateChanged 的调用方式:

    onScrollStateChanged: SCROLL_STATE_DRAGGING
    onScrollStateChanged: SCROLL_STATE_SETTLING
    onScrollStateChanged: SCROLL_STATE_IDLE

    这是您所期望的。但是,如果您在视图稳定之前向上滑动然后再次向上滑动,则会发生以下情况:

    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”。网上有很多很好的资源。

    【讨论】:

    • 如果用户上下滑动而不等待滚动停止,这种情况的解决方案是什么。有没有办法在滑动方向改变时强制状态空闲,还是有另一种更智能/更好的解决方案?
    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 2021-12-15
    • 2021-07-18
    • 2022-01-15
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多