假设我们有分页并且从分页 api 获取产品后 我们必须仅为用户可见的特定产品调用另一个 api 并非所有从分页 api 获取的产品
int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
使用上述方法,但根据我的查询没有为我工作。
// 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;
}
}