在 Recycler View 中使用自定义动画的无限滚动不起作用 Android
Infinite scrolling using custom animations in Recycler View not working Android
我在 Recycler 视图中使用了 Wasabeef 的项目动画,效果很好。我还想为回收器添加无限滚动,为此我正在这样做
public abstract class InfiniteScroller extends RecyclerView.OnScrollListener {
private int previousTotal = 0; // The total number of items in the dataset after the last load
private boolean loading = true; // True if we are still waiting for the last set of data to load.
private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 1;
private LinearLayoutManager mLinearLayoutManager;
public InfiniteScroller(LinearLayoutManager linearLayoutManager) {
this.mLinearLayoutManager = linearLayoutManager;
}
public abstract void onLoadMore(int current_page);
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Do Nothing
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
}
}
这也很好用。真正的挑战是当我将项目动画与无限滚动结合时不起作用,即使调用了 OnScroll 侦听器并且还调用了 loadMore() 并且它在数据源中添加项目但不在回收器视图中显示它。
这是代码。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
mRecylerView = (RecyclerView)view.findViewById(R.id.my_recycler_view);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecylerView.setLayoutManager(mLayoutManager);
initialize();
mAdapter = new MyAdapter(persons);
AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(mAdapter);
ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(alphaAdapter);
scaleAdapter.setDuration(1000);
scaleAdapter.setInterpolator(new OvershootInterpolator());
mRecylerView.setAdapter(scaleAdapter);
mRecylerView.setOnScrollListener(new InfiniteScroller(mLayoutManager) {
@Override
public void onLoadMore(int current_page) {
Log.i("Infinite Scroller", "Current page = " + current_page);
insertNewItem();
}
});
return view;
}
如果我注释掉动画线,它会无限滚动,但不会滚动。
请查看代码并告诉我出了什么问题。
所以我自己发现了问题并解决了:)
遇到同样问题的朋友,我分享一下我的经验。
我正在调用 mAdpter.notifyItemInserted(position) 但它应该是 scaleAdapter.notifyItemInserted(position).
我在 Recycler 视图中使用了 Wasabeef 的项目动画,效果很好。我还想为回收器添加无限滚动,为此我正在这样做
public abstract class InfiniteScroller extends RecyclerView.OnScrollListener {
private int previousTotal = 0; // The total number of items in the dataset after the last load
private boolean loading = true; // True if we are still waiting for the last set of data to load.
private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 1;
private LinearLayoutManager mLinearLayoutManager;
public InfiniteScroller(LinearLayoutManager linearLayoutManager) {
this.mLinearLayoutManager = linearLayoutManager;
}
public abstract void onLoadMore(int current_page);
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// Do Nothing
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
onLoadMore(current_page);
loading = true;
}
}
}
这也很好用。真正的挑战是当我将项目动画与无限滚动结合时不起作用,即使调用了 OnScroll 侦听器并且还调用了 loadMore() 并且它在数据源中添加项目但不在回收器视图中显示它。 这是代码。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_main, container, false);
mRecylerView = (RecyclerView)view.findViewById(R.id.my_recycler_view);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecylerView.setLayoutManager(mLayoutManager);
initialize();
mAdapter = new MyAdapter(persons);
AlphaInAnimationAdapter alphaAdapter = new AlphaInAnimationAdapter(mAdapter);
ScaleInAnimationAdapter scaleAdapter = new ScaleInAnimationAdapter(alphaAdapter);
scaleAdapter.setDuration(1000);
scaleAdapter.setInterpolator(new OvershootInterpolator());
mRecylerView.setAdapter(scaleAdapter);
mRecylerView.setOnScrollListener(new InfiniteScroller(mLayoutManager) {
@Override
public void onLoadMore(int current_page) {
Log.i("Infinite Scroller", "Current page = " + current_page);
insertNewItem();
}
});
return view;
}
如果我注释掉动画线,它会无限滚动,但不会滚动。 请查看代码并告诉我出了什么问题。
所以我自己发现了问题并解决了:)
遇到同样问题的朋友,我分享一下我的经验。
我正在调用 mAdpter.notifyItemInserted(position) 但它应该是 scaleAdapter.notifyItemInserted(position).