0

Я хочу внедрить вложенную прокрутку материала для моего адаптера, который extends AdapterView.Вложенная прокрутка и AdapterView

Проблема заключается в том AdapterView поддерживает setNestedScrollingEnabled только с API 21 и мой минимум 15. Есть ViewGroupCompat и даже AdapterViewCompat, что теоретически может помочь мне повторно реализовать свой адаптер с чем-то вроде extends AdapterViewCompat, но они непригодны в качестве AdapterViewCompat является внутренний и ViewGroupCompat ... final (почему ?!)

Stealmate? Или есть решение?

OK, поэтому ... более подробно.

Поскольку я использую (X, Y) вместо стандартного линейного адаптера, это было удобно, чтобы создать лучший интерфейс (может быть разное количество крестиков на каждый Y, так что ...):

public interface MatrixAdapterInterface extends Adapter { 
    int getRowCount(); 

    int getColCount(int row); 

    Object getItem(int row, int col); 

    View getView(int row, int col, View convertView, ViewGroup parent); 

    boolean isEmpty(); 
} 

Это, конечно, требовал AdapterView, который способен обрабатывать (X, Y) индексацию (отображение (X, Y) в линейную природу ViewGroup), не стоит перечислить в целом здесь:

public abstract class MatrixAdapter<T extends MatrixAdapterInterface> 
     extends AdapterView<T> { 
    .... 
} 

И наконец, макет, который использует это AdapterView, и это не означает, т передавать любые вложенные события прокрутки:

public class XenoMatrixLayout extends 
     MatrixAdapter<SomeMatrixAdapterInterface implementation> { 

} 

Теперь ... потрогать обработка немного сложным ... Во-первых, есть:

@Override 
public boolean dispatchTouchEvent(final MotionEvent ev) { 
    boolean handled = onTouchEvent(ev); 
    if (handled) 
     return true; 
    if (ev.getPointerCount() == 2) 
     processDoubleTouchEvent(ev); 
    handled = mGesture.onTouchEvent(ev); 

    return handled; 
} 

Тогда ты:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if (mFastScroller != null) { 
     boolean intercepted = mFastScroller.onInterceptTouchEvent(ev); 
     if (intercepted) { 
      return true; 
     } 
    } 

    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (mFastScroller != null) { 
     boolean intercepted = mFastScroller.onTouchEvent(ev); 
     if (intercepted) { 
      return true; 
     } 
    } 

    return false; 
} 

Все больше вам нужно знать?

ответ

1

Я ответил на ваш предыдущий аналогичный вопрос; так как вы подробнее указали здесь, я добавлю к моему более раннему ответу:

Ваш пользовательский вид адаптера будет реализовывать интерфейс из библиотеки поддержки. Это позволит работать с такими классами, как CoordinatorLayout, даже на устройствах pre-Lollipop. Когда вложенные методы прокрутки требуют метода в родительском представлении, класс ViewCompat вызовет существующий метод просмотра на Lollipop & позже и вызовет статические методы ViewCompat для KitKat и ранее, где эти методы не существуют.

Поэтому, когда вы делегируете класс-помощник, он делает тяжелый подъем, выясняя, на какой платформе он находится, и какие методы он должен назвать.

Если вы распространяете AdapterView, то вы должны были сделать все свое собственное управление событиями прокрутки, переопределив onTouchEvent(). Это дает вам возможность использовать эти методы. Если вам нужна дополнительная помощь, отправьте свой код, и мы можем попытаться помочь вам более конкретно.

+0

Позвольте мне попробовать и разобраться. Я дам более подробную информацию, если я безнадежно застрял! Спасибо за оба ответа! Хорошо, может, я сделаю это сейчас ... – ssuukk