我在swiperefreshlayout中使用dragsortlistview(https://github.com/bauerca/drag-sort-listview)使其能够“拉入刷新”和可拖动的listview。这是我的XML:

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_below="@id/div_subtitle"
    android:id="@+id/srl_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.mobeta.android.dslv.DragSortListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        dslv:drag_enabled="true"
        dslv:track_drag_sort="false"
        android:divider="@null"
        dslv:use_default_controller="false"
        tools:listitem="@layout/list_kkategori" />
</android.support.v4.widget.SwipeRefreshLayout>

这是我的listview元素的xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:paddingRight="@dimen/right_margin"
    android:paddingLeft="@dimen/left_margin"
    android:background="@color/background"
    android:layout_height="50dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/container_side_dropshadow">

        <ImageView
            android:id="@+id/iv_handler"
            android:layout_width="50dp"
            android:scaleType="fitXY"
            android:layout_height="20dp"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:src="@drawable/draghandler" />

        <TextView
            android:id="@+id/tv_nama"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/textBlack"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_toRightOf="@id/iv_handler"
            android:text="Nama Kategori"
            android:textSize="17sp" />

        <View
            android:layout_width="match_parent"
            android:layout_height="0.5dp"
            android:layout_alignParentBottom="true"
            android:background="@color/dividerColor"
            android:layout_marginLeft="@dimen/left_divider_margin"
            android:layout_marginRight="@dimen/right_divider_margin" />

    </RelativeLayout>

</RelativeLayout>

这是我的DragSortListView初始化,我调用片段的onCreateView
dslv = (DragSortListView) v.findViewById(android.R.id.list);
dslv.addHeaderView(View.inflate(getActivity(), R.layout.list_header, null), null, false);
dslv.addFooterView(View.inflate(getActivity(), R.layout.list_footer, null), null, false);

dslvController = new DragSortController(dslv);
dslvController.setDragHandleId(R.id.iv_handler);
dslvController.setRemoveEnabled(false);
dslvController.setSortEnabled(true);
dslvController.setDragInitMode(DragSortController.ON_DOWN);
dslvController.setRemoveMode(DragSortController.FLING_REMOVE);
dslv.setFloatViewManager(dslvController);
dslv.setOnTouchListener(dslvController);
dslv.setDragEnabled(true);

但是,DragSortListView无法拖动任何列表项,但是Drag-Up函数仍然可以工作。我怀疑当我向下拖动list元素时dragsortlistview中的onTouchListener会被swiperefreshlayout的onTouchListener覆盖。
这个问题有什么解决办法或解决办法吗?我需要两个功能在我的应用程序,刷刷新和拖动列表视图。

最佳答案

我也遇到过同样的问题,但在我的应用程序中,列表有两种状态:第一种状态是用户可以拖放内容,第二种状态是用户可以滑动刷新整个列表。
所以,我找到了在列表处于拖放状态时如何防止滑动刷新操作的方法。重点是重写swiperFreshLayout的函数canChildScrollUp(),默认情况下,该函数防止任何absListView的滑动行为,除非在列表的第一行位于顶部时执行该操作。我正在检查子视图是否是DragSortListView的实例,如果list.isDragenabled(),则返回true。您也可以在这里实现任何其他逻辑。
这是我的自定义刷新布局:

public class CustomSwipeRefreshLayout extends SwipeRefreshLayout {

private View mTarget;

public CustomSwipeRefreshLayout(Context context) {
    super(context);
}

public CustomSwipeRefreshLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean canChildScrollUp() {
    ensureTarget();
    if (mTarget != null && mTarget instanceof DragSortListView)
        return super.canChildScrollUp()||((DragSortListView)mTarget).isDragEnabled();
    return super.canChildScrollUp();
}

/**
* Had to copy the method from SwipeRefreshLayout
**/
private void ensureTarget() {
    // Don't bother getting the parent height if the parent hasn't been laid
    // out yet.
    if (mTarget == null) {
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            if (! (child instanceof ImageView)) {
            // In fact, refresh icon is instanseof CircleImageView, but the
            // class is private, so I decided to compare with ImageView.
                mTarget = child;
                break;
            }
        }
    }
}

}
希望能帮上忙。

10-08 17:44