Защелкивание в горизонтальном виде переработчика

У меня есть горизонтальное представление Recycler, и я хочу включить привязку в нем. Я прочитал некоторые темы на SO и обнаружил, что этот код работает очень хорошо. Я не очень хорошо разбираюсь во внутренних принципах работы Recycler View и Layout Manager, поэтому хотел спросить, можно ли изменить код на:

  1. Независимо от того, какова скорость броска, я хочу переместить только один элемент вперед или назад.

  2. Скорость привязки низкая. Если я переместу вид более чем на половину ширины, следующий элемент окажется в центре, но очень медленно. Может ли это быть увеличено, чтобы оснастка была мгновенной?

Любые идеи о том, как достичь вышеуказанного поведения, будут очень полезны.

1 ответ

Решение

Наконец-то понял это с помощью других кодов:

public class FlingRecyclerView extends RecyclerView {

    int screenWidth;

    public FlingRecyclerView(Context context) {
        super(context);
        WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
    }

    public FlingRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
    }

    public FlingRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        screenWidth = size.x;
    }

    @Override
    public boolean fling(int velocityX, int velocityY) {
        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();

//these four variables identify the views you see on screen.
        int lastVisibleView = linearLayoutManager.findLastVisibleItemPosition();
        int firstVisibleView = linearLayoutManager.findFirstVisibleItemPosition();
        View firstView = linearLayoutManager.findViewByPosition(firstVisibleView);
        View lastView = linearLayoutManager.findViewByPosition(lastVisibleView);

//these variables get the distance you need to scroll in order to center your views.
//my views have variable sizes, so I need to calculate side margins separately.
//note the subtle difference in how right and left margins are calculated, as well as
//the resulting scroll distances.


        int leftMargin = (screenWidth - lastView.getWidth()) / 2;
        int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
        int leftEdge = lastView.getLeft();
        int rightEdge = firstView.getRight();
        int scrollDistanceLeft = leftEdge - leftMargin;
        int scrollDistanceRight = rightMargin - rightEdge;

//if(user swipes to the left)
        if (velocityX > 0) smoothScrollBy(scrollDistanceLeft, 0);
        else smoothScrollBy(-scrollDistanceRight, 0);

        return true;
    }
}

Работает потрясающе для моих требований. Надеюсь, это поможет кому-то еще.

Другие вопросы по тегам