java findFirstVisibleItemPositions 不适用于 recycleview android
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29463560/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
findFirstVisibleItemPositions doesn't work for recycleview android
提问by user3535747
I have this code:
我有这个代码:
mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int[] firstVisibleItemPositions = new int[getResources().getInteger(R.integer.news_numbers_column)];
int pastVisiblesItems = ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions)[0];
}
});
When I scroll my recycleview I get this error:
当我滚动我的回收视图时,我收到此错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.support.v7.widget.OrientationHelper.getStartAfterPadding()' on a null object reference
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findOneVisibleChild(StaggeredGridLayoutManager.java:2177)
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findFirstVisibleItemPosition(StaggeredGridLayoutManager.java:2153)
at android.support.v7.widget.StaggeredGridLayoutManager.findFirstVisibleItemPositions(StaggeredGridLayoutManager.java:806)
at info.lanouvelletribune.apps.android.ui.fragments.NewsFragment.onScrollStateChanged(NewsFragment.java:90)
at android.support.v7.widget.RecyclerView.setScrollState(RecyclerView.java:751)
at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:1535)
at com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView.onInterceptTouchEvent(ObservableRecyclerView.java:188)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2060)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2390)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1741)
at android.app.Activity.dispatchTouchEvent(Activity.java:2826)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2351)
at android.view.View.dispatchPointerEvent(View.java:8590)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4098)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3964)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3515)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3617)
at android
How can I do to handle this error and get the first visible item position?
我该如何处理这个错误并获得第一个可见的项目位置?
回答by zed007
I tested it with this code and it works fine with me
我用这段代码对其进行了测试,它对我来说很好用
int positionView = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
I used the recycle view parameter.
我使用了回收视图参数。
回答by Ankit Aggarwal
Try this:
试试这个:
int position = layoutManager.findFirstVisibleItemPositions(null)[0];
where layoutManager
is what you set in your recyclerview
.
这里layoutManager
是你在你的设置recyclerview
。
For example,
例如,
layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mrecyclerView.setLayoutManager(layoutManager );
回答by user3793358
You can use this :
你可以使用这个:
int[] firstVisibleItemPositions = new int[yourNumberOfColumns];
int pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItem??Positions)[0];
回答by Mr.Hosseini
Use these two methods :
使用这两种方法:
/**
* @return Last visible item position for staggeredGridLayoutManager
*/
private int getLastVisibleItem(int[] lastVisibleItemPositions) {
int maxSize = 0;
for (int position : lastVisibleItemPositions) {
if (position > maxSize) {
maxSize = position;
}
}
return maxSize;
}
/**
* @return First visible item position for staggeredGridLayoutManager
*/
private int getFirstVisibleItem(int[] firstVisibleItemPositions) {
int minSize = 0;
if (firstVisibleItemPositions.length > 0) {
minSize = firstVisibleItemPositions[0];
for (int position : firstVisibleItemPositions) {
if (position < minSize) {
minSize = position;
}
}
}
return minSize;
}
and getLastVisibleItem method as below:
和 getLastVisibleItem 方法如下:
int[] lastVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(null);
int[] firstVisibleItemPositions = ((StaggeredGridLayoutManager) layoutManager).findFirstVisibleItemPositions(null);
// get maximum element within the list
lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions);
firstVisibleItem = getFirstVisibleItem(firstVisibleItemPositions);
回答by varotariya vajsi
If you are using StaggeredGridLayoutManager you can find findLastVisibleItemPositionslike below:
如果您使用 StaggeredGridLayoutManager,您可以找到如下所示的findLastVisibleItemPositions:
int visibleThreshold =1;
final StaggeredGridLayoutManager linearLayoutManager = (StaggeredGridLayoutManager) mRecyclerViewAllPost.getLayoutManager();
mRecyclerViewAllPost.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int[] lastVisibleItemPositions = linearLayoutManager.findLastVisibleItemPositions(null);
int lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions);
int totalItemCount = linearLayoutManager.getItemCount();
if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
print("load more item ");
isLoading = true;
}
}
});
and getLastVisibleItemmethod as below:
和getLastVisibleItem方法如下:
public int getLastVisibleItem(int[] lastVisibleItemPositions) {
int maxSize = 0;
for (int i = 0; i < lastVisibleItemPositions.length; i++) {
if (i == 0) {
maxSize = lastVisibleItemPositions[i];
}
else if (lastVisibleItemPositions[i] > maxSize) {
maxSize = lastVisibleItemPositions[i];
}
}
return maxSize;
}
回答by subhash gaikwad
You can try it this way:
你可以这样试试:
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager();
Or you can use your staggeredlayoutManager
object directly instead of above object:
或者你可以staggeredlayoutManager
直接使用你的对象而不是上面的对象:
int[] into = staggeredGridLayoutManager .findLastVisibleItemPositions(null);
List<Integer> intoList = new ArrayList<>();
for (int i : into)
{
intoList.add(i);
}
int firstVisbleoitem= Collections.max(intoList);
回答by TalkLittle
This is a bug in the RecyclerView StaggeredGridLayoutManager:
这是 RecyclerView StaggeredGridLayoutManager 中的一个错误:
https://code.google.com/p/android/issues/detail?id=180521
https://code.google.com/p/android/issues/detail?id=180521
https://code.google.com/p/android/issues/detail?id=181461
https://code.google.com/p/android/issues/detail?id=181461
A workaround is to try/catch the exception:
解决方法是尝试/捕获异常:
try {
((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions);
} catch (NullPointerException ex) {
// workaround for RecyclerView bug. assume not laid out, so no items visible
firstVisibleItemPositions[0] = RecyclerView.NO_POSITION;
firstVisibleItemPositions[1] = RecyclerView.NO_POSITION;
}