使用StickyListHeaders的SwipeActionAdapter

时间:2015-08-04 23:25:41

标签: android adapter swipe

我正在尝试将这两个非常棒的Android库结合起来:

https://github.com/emilsjolander/StickyListHeaders

https://github.com/wdullaer/SwipeActionAdapter

我曾与SwipeActionAdapter的所有者合作过,他说这是可能的(https://github.com/wdullaer/SwipeActionAdapter/issues/29),但我仍然收到错误:

08-02 11:33:07.364    1655-1655/com.slaptap.tappedin E/InputEventReceiver﹕ Exception dispatching input event.
08-02 11:33:07.364    1655-1655/com.slaptap.tappedin E/MessageQueue-JNI﹕ Exception in MessageQueue callback: handleReceiveCallback
08-02 11:33:07.380    1655-1655/com.slaptap.tappedin E/MessageQueue-JNI﹕ java.lang.NullPointerException
            at com.wdullaer.swipeactionadapter.SwipeActionTouchListener.onTouch(SwipeActionTouchListener.java:419)
            at android.view.View.dispatchTouchEvent(View.java:7701)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)

我的滑动适配器包裹了我的基本适配器。然后我有另一个适配器(ListStickyAdapter),它扩展了Decorator适配器并实现了Sticky Adapater。

 mAdapter = new ListAdapter(getActivity(), data);
 swipeAdapter = new SwipeActionAdapter(mAdapter);
 ListStickyAdapter vbsa = new ListStickyAdapter(swipeAdapter);
 listView.setAdapter(vbsa);

 // is it because of this line? (having to pass the sticky header child list)
 swipeAdapter.setListView(listView.getWrappedList())

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

你的猜测似乎是正确的,可能就是那条线:

MultipartEntityBuilder

您在SwipeActionTouchListener的第419行有错误,因为找不到(向下)视图组:

swipeAdapter.setListView(listView.getWrappedList())

mDownViewGroup是在向下操作时初始化的子视图:

L419 mDownViewGroup.showBackground...

我不知道你提供的listview.getWrappedList()背后的结构,但我的猜测是swipeaction不喜欢它。如果它不喜欢它,可能是因为包装删除了子结构(int childCount = mListView.getChildCount();< - 你得到childcount = 0,mDownViewGroup没有被初始化)。尝试理解为什么包装列表删除子结构,你可能会得到正在发生的事情。

编辑:搜索了一下,看起来并不是因为它没有得到孩子,而是因为它得到的不是swipeviewgroup:

 ...
 child = mListView.getChildAt(i);
 child.getHitRect(rect);
 if (rect.contains(x, y)) {
     try {
         mDownViewGroup = (SwipeViewGroup) child;
         ...

我设法通过分叉使WrapperView扩展SwipeViewGroup(而不是ViewGroup)。还必须保护一些touchlistener npe,但这里没什么大不了的。但这就是它所需要的一切。

此处提供的工作示例: https://github.com/he667/StickyListSwipe

答案 1 :(得分:1)

看起来StickyListHeaders正在使用一种非常类似于SwipeActionAdapter的方法,因为它包装了底层视图,并可能覆盖了一些touchlisteners来完成它的工作。

Gomoku7是正确的,你需要创建一个StickyListHeaders的分支才能使它工作。由于库的完成方式,它们的包装器必须是最后一个,因此它需要知道下面的SwipeViewGroup(通过从该类扩展),就像它需要知道底层View可以实现Checkable的事实一样