如何获取用户在recyclerview中可见的单个项目,但不是从recyclerview加载的所有项目?

问题描述 投票:0回答:1

假设我们有分页并且从分页 api 获取产品后 我们必须仅为用户可见的特定产品调用另一个 api 并非所有从分页 api 获取的产品

                    int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                    int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
                    int findLastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                    int findLastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();

使用上述方法,但根据我的查询没有为我工作。

android android-recyclerview pagination adapter android-nestedscrollview
1个回答
0
投票
// Step 1: RecyclerView Scroll
rvImage.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);
        if (currentPage == 1) {
            int firstItem = mLayoutManager.findFirstVisibleItemPosition();
            int lastItem = mLayoutManager.findLastVisibleItemPosition();
            for (itemPosition = firstItem; itemPosition <= lastItem; itemPosition++) {
                // todo working code below
                View childView = rvImage.getChildAt(itemPosition);
                if (childView != null) {
                    int childTop = childView.getTop();
                    int childBottom = childView.getBottom();

                    if ((childBottom >= dy && childBottom <= dy + ns_view.getHeight())) {
                        // Item is visible
                        int childPosition = rvImage.getChildAdapterPosition(childView);
                        if (!modelList.get(childPosition).isImpressionSet()) {
                            Log.e("Post position==>", String.valueOf(childPosition));
                            Log.e("Post PostItem==>", String.valueOf(modelList.get(childPosition).getPrice()));
                            ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
                            executor.schedule(new MyRunnable(TagDetailActivity.this,
                                            modelList.get(childPosition), tagDetailAdapter,
                                            childPosition,
                                            HamaUtils.getaccesstoken(TagDetailActivity.this), true),
                                    2, TimeUnit.SECONDS);
                        }
                    } else {
                        Log.d("VisibleCount==>", "Item " + itemPosition + " is not visible");
                        break;
                    }
                }
            }
        }
    }
});

// Step 2: NestedScrollView Scroll
ns_view.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
    @Override
    public void onScrollChange(NestedScrollView nestedScrollView, int scrollX, int i1, int i2, int i3) {
        if (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1) != null) {
            if ((i1 >= (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1).getMeasuredHeight() - nestedScrollView.getMeasuredHeight())) &&
                    i1 > i3) {
                // code to fetch more data for endless scrolling
                visibleItemCount = mLayoutManager.getChildCount();
                totalItemCount = mLayoutManager.getItemCount();
                pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
                if (loading) {
                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        loading = false;
                        currentPage += 1;
                        progressBar.setVisibility(View.VISIBLE);
                        if (HamaUtils.isNetworkAvailable(TagDetailActivity.this)) {
                            getTagDetails(String.valueOf(currentPage));
                        }
                    }
                }
            }
            if (itemPosition < modelList.size())
                checkScrollVisibility(ns_view, i3, i1, itemPosition, false);
        }
    }
});

// Step 3: Function for checking visibility in nested scroll
public void checkScrollVisibility(NestedScrollView nestedScrollView, int i1, int i3, int itemPosition, boolean isFirstTime) {
    View childView = rvImage.getChildAt(itemPosition);
    if (childView != null) {
        int childTop = childView.getTop();
        int childBottom = childView.getBottom();

        if ((childBottom >= i3 && childBottom <= i1 + nestedScrollView.getHeight())) {
            // Item is visible
            int childPosition = rvImage.getChildAdapterPosition(childView);
            if (!modelList.get(childPosition).isImpressionSet()) {
                Log.e("Post position==>", String.valueOf(childPosition));
                Log.e("Post PostItem==>", String.valueOf(modelList.get(childPosition).getPrice()));
                ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
                executor.schedule(new MyRunnable(TagDetailActivity.this,
                                modelList.get(childPosition), tagDetailAdapter,
                                childPosition,
                                HamaUtils.getaccesstoken(TagDetailActivity.this), false),
                        2, TimeUnit.SECONDS);
            }
        } else {
            // Item is not visible
            Log.d("VisibleCount==>", "Item " + itemPosition + " is not visible");
        }
    }
}

// Step 4: API call in background
public class MyRunnable implements Runnable {
    Activity mContext;
    Post_Main postData;
    int position;
    String accesstoken;
    boolean isFirstTime = true;

    public MyRunnable(Activity context, Post_Main postData,
                      TagDetailAdapter adapter, int item,
                      String getaccesstoken, boolean isFirstTime) {
        this.mContext = context;
        this.position = item;
        this.accesstoken = getaccesstoken;
        this.postData = postData;
        this.isFirstTime = isFirstTime;
    }

    @Override
    public void run() {
        // This code runs in the background
        int result = setImpressionAndVisit(postData, position);

        // This code runs on the main thread
        mContext.runOnUiThread(() -> {
            // Update the UI with the result
        });
    }

    private int setImpressionAndVisit(Post_Main postData, int position) {
        try {
            APIService apiService = Config.getClient().create(APIService.class);
            Call<ResponseBody> call = apiService.setImpression(HamaUtils.getaccesstoken(TagDetailActivity.this),
                    HamaUtils.content_type, HamaUtils.getIpAddress(), postData.getID(),
                    HamaUtils.IMPRESSION_VISIT.impression.name(), HamaUtils.IMPRESSION_FROM.hashtag_page.name());

            call.enqueue(new Callback<ResponseBody>() {
                @Override
                public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                    if (response.isSuccessful()) {
                        if (response.body() != null) {
                            String jstr = null;
                            try {
                                jstr = response.body().string();
                                JSONObject jsonobject = new JSONObject(jstr);
                                if (response.code() == 200) {
                                    String code = jsonobject.optString("code");
                                    String error = jsonobject.optString("error");
                                    if (code.matches("200")) {
                                        JSONObject dataObject = jsonobject.optJSONObject("data");
                                        String message = dataObject.optString("message");
                                        Log.e("Impression Response==>", message);
                                        modelList.get(position).setImpressionSet(true);
                                        tagDetailAdapter.notifyItemChanged(position);
                                        if (!isFirstTime)
                                            itemPosition++;
                                    }
                                }
                            } catch (Exception e) {
                                throw new RuntimeException(e);
                            }
                        }
                    }
                }

                @Override
                public void onFailure(Call<ResponseBody> call, Throwable t) {

                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
        return position;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.