2015-10-09 4 views
2

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

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

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

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

ответ

2

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

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; 
    } 
} 

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

 Смежные вопросы

  • Нет связанных вопросов^_^