我想为我的适配器实现 Material 嵌套滚动extends AdapterView
。
问题是仅AdapterView
支持setNestedScrollingEnabled
API 21,我的最小值是 15。理论上ViewGroupCompat
,甚至AdapterViewCompat
可以帮助我用类似的东西重新实现我的适配器extends AdapterViewCompat
,但是它们无法使用,因为它们AdapterViewCompat
是内部的并且ViewGroupCompat
是...... final
(为什么?! )
偷窃?或者有解决办法吗?
好的,所以...更多细节。
由于我使用的是 (X,Y) 而不是标准线性适配器,因此可以方便地创建更好的接口(每个 Y 可以有不同数量的 X,所以...):
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;
}
还有什么需要知道的吗?