0

我想为我的适配器实现 Material 嵌套滚动extends AdapterView

问题是仅AdapterView支持setNestedScrollingEnabledAPI 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;
}

还有什么需要知道的吗?

4

1 回答 1

1

我回答了你之前的类似问题;由于您在此处提供了更多详细信息,因此我将添加到我之前的答案中:

您的自定义适配器视图将实现NestedScrollingChild来自支持库的接口。这将允许它与类似的类一起工作CoordinatorLayout,即使在棒棒糖之前的设备上也是如此。当嵌套滚动方法需要视图父视图上的方法时,ViewCompat该类将调用 Lollipop 及更高版本上现有的视图方法,并调用ViewCompatKitKat 及更早版本的静态方法,这些方法不存在。

因此,当您委托给辅助类时,它会承担繁重的工作,以确定它在哪个平台上以及它必须调用哪些方法。

如果您正在扩展,AdapterView那么您必须通过覆盖完成所有自己的滚动事件处理onTouchEvent()。这使您有机会使用这些方法。如果您需要更多帮助,请发布您的代码,我们可以尝试更具体地帮助您。

于 2016-03-01T12:45:21.310 回答