我想为extends AdapterView
。
问题是AdapterView
仅支持来自API 21的setNestedScrollingEnabled
,而我的最小值为15. ViewGroupCompat
甚至AdapterViewCompat
,理论上可以帮助我用extends AdapterViewCompat
之类的东西来实现我的适配器,但它们无法使用,因为AdapterViewCompat
是内部的ViewGroupCompat
是...... final
(为什么?!)
Stealmate?或者有解决方案吗?
好的,所以...更多细节。
由于我使用(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;
}
还有什么需要知道的吗?
答案 0 :(得分:1)
我回答了你以前的类似问题;既然你在这里提供了更多的细节,我将在我之前的回答中添加:
您的自定义适配器视图将实现支持库中的NestedScrollingChild
接口。这将允许它与CoordinatorLayout
等类一起工作,即使在前Lollipop设备上也是如此。当嵌套滚动方法在视图父级上需要一个方法时,ViewCompat
类将调用Lollipop&amp;上的现有视图方法。之后,调用KitKat及更早版本的静态ViewCompat
方法,这些方法不存在。
因此,当您委托给帮助程序类时,它会解决它所处理的平台以及必须调用的方法。
如果您要扩展AdapterView
,那么您必须通过覆盖onTouchEvent()
完成所有自己的滚动事件处理。这使您有机会使用这些方法。如果您需要更多帮助,请发布您的代码,我们可以尝试更具体地帮助您。