如何在RecyclerView将其折叠到中心后获取中心项目?

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)


Mik*_*rin 7

即使你不打算使用,SnapHelper你也可以获得中心元素的位置RecyclerView.OnScrollListener.

  1. MiddleItemFinder类复制到您的项目.
  2. 创建回调对象MiddleItemCallback.

    MiddleItemFinder.MiddleItemCallback callback = 
            new MiddleItemFinder.MiddleItemCallback() {
                    @Override
                    public void scrollFinished(int middleElement) {
                        // interaction with middle item
                    }
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 添加新的滚动侦听器到您的 RecyclerView

    recyclerView.addOnScrollListener(
            new MiddleItemFinder(getContext(), layoutManager, 
                    callback, RecyclerView.SCROLL_STATE_IDLE));
    
    Run Code Online (Sandbox Code Playgroud)
  4. 最后一个参数或MiddleItemFinder构造函数是scrollState.

    • RecyclerView.SCROLL_STATE_IDLE - RecyclerView当前没有滚动.滚动完了.
    • RecyclerView.SCROLL_STATE_DRAGGING - RecyclerView当前被外部输入拖动,例如用户触摸输入.
    • RecyclerView.SCROLL_STATE_SETTLING - RecyclerView目前正在动画到最终位置而不受外部控制.
    • MiddleItemFinder.ALL_STATES - 所有州一起.
  5. 例如,如果选择RecyclerView.SCROLL_STATE_IDLE最后一个构造函数参数而不是所有滚动结束,则回调对象将返回中间元素位置.

MiddleItemFinder类:

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)