嵌套滚动和AdapterView

时间:2016-03-01 08:55:33

标签: android android-view android-adapterview android-viewgroup

我想为extends AdapterView

的适配器实现Material嵌套滚动

问题是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;
}

还有什么需要知道的吗?

1 个答案:

答案 0 :(得分:1)

我回答了你以前的类似问题;既然你在这里提供了更多的细节,我将在我之前的回答中添加:

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

因此,当您委托给帮助程序类时,它会解决它所处理的平台以及必须调用的方法。

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