简体   繁体   English

加载10个项目乘10个Recyclerview项目

[英]Load 10 items by 10 items of Recyclerview

From JSON file I get almost (200-300 image URL), I'm trying to load 10 images by 10 images to make the images load quickly instead of loading all the images (200-300) at once .but I have a problem RecyclerView Stop scrolling after the first 10 items, here's what I have tried: JSON文件中我几乎得到了(200-300个图像URL),我试图以10张图像加载10张图像以使图像快速加载,而不是一次加载所有图像(200-300)。但是我有一个问题RecyclerView在前10个项目之后停止滚动,这是我尝试过的操作:

InfiniteScrollListener.java InfiniteScrollListener.java

 private void initInfiniteScrollListener(LinearLayoutManager mLayoutManager) {
        infiniteScrollListener = new InfiniteScrollListener(mLayoutManager) {
            @Override
            public void onLoadMore(int page) {
                pb.setVisibility(View.VISIBLE);
                refreshContent();

            }
        };
        recyclerView.addOnScrollListener(infiniteScrollListener);
    }

Method to set adapter: 设置适配器的方法:

private void refreshContent() {
    fetchRemoteData(new DataStatus() {
        @Override
        public void onSuccess(List<Post> posts) {
            loading.setVisibility(View.GONE);
            pb.setVisibility(View.GONE);
            if (adapter == null) {
                adapter = new MyAdapter(posts, getActivity(), new RecyclerViewClickListener() {
                    @Override
                    public void onClick(View view, Post post) {
                    }
                });
                recyclerView.setAdapter(adapter);
            } else {
                int position = adapter.getItemCount();
                adapter.getItems().addAll(posts);
                adapter.notifyItemRangeInserted(position, position + 10);
            }
        }

        @Override
        public void onError(Exception e) {
            slowinternetconnection();
        }
    });
}

Fetching data: 提取数据:

private void fetchRemoteData(final DataStatus callback) {

        StringRequest stringRequest = new StringRequest(Request.Method.GET,
                URL_DATA,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        List<Post> listItems = new ArrayList<>();
                        List<Post> PagintationList = new ArrayList<>();
                        try {
                            JSONObject jsonObject = new JSONObject(s);
                            JSONArray array = jsonObject.getJSONArray("bgs");
                            for (int i = 0; i < array.length(); i++) {
                                JSONObject o = array.getJSONObject(i);
                                Post item = new Post(
                                        o.optString("img"),
                                        o.optString("name")
                                );
                                listItems.add(item);
                            }
                            for (int count = resetNumber; count < 10; count++) {
                                PagintationList.add(listItems.get(count));
                            }
                            resetNumber = PagintationList.size() + 1;
                            callback.onSuccess(PagintationList);
                        } catch (JSONException e) {
                            slowinternetconnection();
                        }

                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        callback.onError(error);
                    }
                });
        RequestQueue requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());
        stringRequest.setShouldCache(false);
        requestQueue.getCache().clear();
        requestQueue.add(stringRequest);
    }

What I want is: 我想要的是:

From 250 images for example, I want to load 10 images each time user scroll recyclerview, until 250 image to have been completed 例如,从250张图像中,我希望每次用户滚动recyclerview时加载10张图像,直到完成250张图像

  private void populateData() {
    int i = 0;
    while (i < 10) {
        rowsArrayList.add("Item " + i);
        i++;
    }
 }

  private void initAdapter() {

    recyclerViewAdapter = new RecyclerViewAdapter(rowsArrayList);
    recyclerView.setAdapter(recyclerViewAdapter);
}

private void initScrollListener() {
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }

        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

            if (!isLoading) {
                if (linearLayoutManager != null && linearLayoutManager.findLastCompletelyVisibleItemPosition() == rowsArrayList.size() - 1) {
                    //bottom of list!
                    loadMore();
                    isLoading = true;
                }
            }
        }
    });


}

private void loadMore() {
    rowsArrayList.add(null);
    recyclerViewAdapter.notifyItemInserted(rowsArrayList.size() - 1);


    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            rowsArrayList.remove(rowsArrayList.size() - 1);
            int scrollPosition = rowsArrayList.size();
            recyclerViewAdapter.notifyItemRemoved(scrollPosition);
            int currentSize = scrollPosition;
            int nextLimit = currentSize + 10;

            while (currentSize - 1 < nextLimit) {
                rowsArrayList.add("Item " + currentSize);
                currentSize++;
            }

            recyclerViewAdapter.notifyDataSetChanged();
            isLoading = false;
        }
    }, 2000);


}

In Adapter Class 在适配器类中

public class RecyclerViewAdapter extends RecyclerView.Adapter { 公共类RecyclerViewAdapter扩展了RecyclerView.Adapter {

private final int VIEW_TYPE_ITEM = 0;
private final int VIEW_TYPE_LOADING = 1;

public List<String> mItemList;


public RecyclerViewAdapter(List<String> itemList) {

    mItemList = itemList;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (viewType == VIEW_TYPE_ITEM) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_row, parent, false);
        return new ItemViewHolder(view);
    } else {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_loading, parent, false);
        return new LoadingViewHolder(view);
    }
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {

    if (viewHolder instanceof ItemViewHolder) {

        populateItemRows((ItemViewHolder) viewHolder, position);
    } else if (viewHolder instanceof LoadingViewHolder) {
        showLoadingView((LoadingViewHolder) viewHolder, position);
    }

}

@Override
public int getItemCount() {
    return mItemList == null ? 0 : mItemList.size();
}

/**
 * The following method decides the type of ViewHolder to display in the RecyclerView
 *
 * @param position
 * @return
 */
@Override
public int getItemViewType(int position) {
    return mItemList.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
}


private class ItemViewHolder extends RecyclerView.ViewHolder {

    TextView tvItem;

    public ItemViewHolder(@NonNull View itemView) {
        super(itemView);

        tvItem = itemView.findViewById(R.id.tvItem);
    }
}

private class LoadingViewHolder extends RecyclerView.ViewHolder {

    ProgressBar progressBar;

    public LoadingViewHolder(@NonNull View itemView) {
        super(itemView);
        progressBar = itemView.findViewById(R.id.progressBar);
    }
}

private void showLoadingView(LoadingViewHolder viewHolder, int position) {
    //ProgressBar would be displayed

}

private void populateItemRows(ItemViewHolder viewHolder, int position) {

    String item = mItemList.get(position);
    viewHolder.tvItem.setText(item);

}

Check out this link https://www.journaldev.com/24041/android-recyclerview-load-more-endless-scrolling 查看此链接https://www.journaldev.com/24041/android-recyclerview-load-more-endless-scrolling

you can load 10 items first then refreshing and load next 10. 您可以先加载10个项目,然后刷新并加载下10个项目。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在 RecyclerView 中仅显示 10 个项目 - show only 10 items in RecyclerView RecyclerView --SelectionTracker 将选择大小限制为 10 个项目 - RecyclerView --SelectionTracker limit selection size to 10 items 有什么办法可以一次在recyclerview中加载5到10个项目,而不是50k? - Is there any way to load 5 - 10 items in recyclerview at a time instead of 50k? 第一次使用3个跨度计数的GridLayoutManager在RecyclerView中加载超过10个项目 - Load more than 10 items in RecyclerView with GridLayoutManager of 3 span count on first time 如何在Android上先显示Horizo​​ntal RecyclerView的前10个项目,然后滑动以显示另外10个项目? - How to show Horizontal RecyclerView first 10 items and then swipe to show another 10 items in android? 将recyclerview项限制为仅10个,而无需使用过滤器 - Limit recyclerview items to only 10 without paginating with filter 在recyclerview中更新10到15个项目时,Diffutils阻止UI - Diffutils block UI when updating 10 to 15 items in recyclerview 提前在Recyclerview中加载项目 - Load Items in Advance in Recyclerview 一次加载所有 RecyclerView 项目 - Load all RecyclerView items at once 在列表视图中仅加载 10 个项目 - Loading only 10 items in listview
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM