YUS*_*MLE 10 android snapping android-recyclerview
我正在实现一个水平RecyclerView按钮,在滚动后将项目捕捉到中心,就像谷歌播放App水平列表一样.这是一篇评论.
我的代码如下:
MainMenuAdapter mainMenuAdapter = new MainMenuAdapter(this, mDataset);
final LinearLayoutManager layoutManagaer = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
RecyclerView mainMenu = (RecyclerView) findViewById(R.id.main_menu);
mainMenu.setLayoutManager(layoutManagaer);
mainMenu.setAdapter(mainMenuAdapter);
final SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(mainMenu);
Run Code Online (Sandbox Code Playgroud)
如何将中心项目(位置)RecyclerView折叠到中心后如何获得?对此没有任何监听器实现吗?此外,当触摸项目视图时,我想将其捕捉到中心.我怎样才能做到这一点?
Bla*_*elt 12
如果你需要View,你可以打电话
View view = snapHelper.findSnapView(layoutManagaer);
Run Code Online (Sandbox Code Playgroud)
获得视图后,您应该能够获得该视图的数据集上的位置.例如使用
mainMenu.getChildAdapterPosition(view)
Run Code Online (Sandbox Code Playgroud)
即使你不打算使用,SnapHelper你也可以获得中心元素的位置RecyclerView.OnScrollListener.
MiddleItemFinder类复制到您的项目.创建回调对象MiddleItemCallback.
MiddleItemFinder.MiddleItemCallback callback =
new MiddleItemFinder.MiddleItemCallback() {
@Override
public void scrollFinished(int middleElement) {
// interaction with middle item
}
};
Run Code Online (Sandbox Code Playgroud)添加新的滚动侦听器到您的 RecyclerView
recyclerView.addOnScrollListener(
new MiddleItemFinder(getContext(), layoutManager,
callback, RecyclerView.SCROLL_STATE_IDLE));
Run Code Online (Sandbox Code Playgroud)最后一个参数或MiddleItemFinder构造函数是scrollState.
RecyclerView.SCROLL_STATE_IDLE - RecyclerView当前没有滚动.滚动完了.RecyclerView.SCROLL_STATE_DRAGGING - RecyclerView当前被外部输入拖动,例如用户触摸输入.RecyclerView.SCROLL_STATE_SETTLING - RecyclerView目前正在动画到最终位置而不受外部控制.MiddleItemFinder.ALL_STATES - 所有州一起.RecyclerView.SCROLL_STATE_IDLE最后一个构造函数参数而不是所有滚动结束,则回调对象将返回中间元素位置.public class MiddleItemFinder extends RecyclerView.OnScrollListener {
private
Context context;
private
LinearLayoutManager layoutManager;
private
MiddleItemCallback callback;
private
int controlState;
public
static final int ALL_STATES = 10;
public MiddleItemFinder(Context context, LinearLayoutManager layoutManager, MiddleItemCallback callback, int controlState) {
this.context = context;
this.layoutManager = layoutManager;
this.callback = callback;
this.controlState = controlState;
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (controlState == ALL_STATES || newState == controlState) {
int firstVisible = layoutManager.findFirstVisibleItemPosition();
int lastVisible = layoutManager.findLastVisibleItemPosition();
int itemsCount = lastVisible - firstVisible + 1;
int screenCenter = context.getResources().getDisplayMetrics().widthPixels / 2;
int minCenterOffset = Integer.MAX_VALUE;
int middleItemIndex = 0;
for (int index = 0; index < itemsCount; index++) {
View listItem = layoutManager.getChildAt(index);
if (listItem == null)
return;
int leftOffset = listItem.getLeft();
int rightOffset = listItem.getRight();
int centerOffset = Math.abs(leftOffset - screenCenter) + Math.abs(rightOffset - screenCenter);
if (minCenterOffset > centerOffset) {
minCenterOffset = centerOffset;
middleItemIndex = index + firstVisible;
}
}
callback.scrollFinished(middleItemIndex);
}
}
public interface MiddleItemCallback {
void scrollFinished(int middleElement);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4483 次 |
| 最近记录: |