3

我在SwipeRefreshLayout中使用DragSortListView(https://github.com/bauerca/drag-sort-listview)使其能够“拉到刷新”和可拖动列表视图。这里是我的XML:DragSortListView不能在SwipeRefreshLayout上拖动

<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> 

这是我的列表视图元素的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 intialization,我在我的我的片段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不能拖拽任何列表项,但拖拽功能仍然有效。我怀疑拖动列表元素时DragSortListView中的onTouchListener以某种方式被SwipeRefreshLayout的onTouchListener覆盖。

有没有解决方法或解决此问题的方法?我需要在我的应用程序中的功能,刷新到刷新和拖动列表视图。

回答

0

使用dslvController.setDragInitMode(DragSortController.ON_LONG_PRESS);代替dslvController.setDragInitMode(DragSortController.ON_DOWN);


我的坏,仍然有拖下来的问题。一个肮脏的解决方法是稍微向上移动该项目,然后再向下拖动它。我知道这有点糟糕,我正在通过SwipeRefreshLayout上的文档进行阅读,如果我发现任何内容,将会更新。对不起,错误的解决方案。

1

我面临同样的问题,但在我的应用程序中有2个列表状态:第一个 - 当用户可以拖动&删除内容,第二个 - 当用户可以刷卡刷新整个列表。

因此,我发现了如何防止刷卡刷新动作,同时我的列表正在拖动&丢弃状态。重点是重写SwipeRefreshLayout函数的函数canChildScrollUp(),默认情况下可以防止任何AbsListView的滑动行为,除非该行为在列表的第一行位于顶部时完成。我检查子视图是否是DragSortListView的实例,如果是list.isDragEnabled(),则返回true。你也可以在这里实现任何其他的逻辑。

这里是我的CustomSwipeRefreshLayout:

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; 
      } 
     } 
    } 
} 

}

希望,这将帮助别人。

+0

要添加到此,您可以修改DragSortListView类并为mDragState创建一个getter。然后,在'canChildScrollUp()'方法中,您可以检查如下内容:'((DragSortListView)mTarget).getDragState()!= DragSortListView.IDLE',当您不拖动时始终显示滑动刷新操作。这样你就不必依赖'isDragEnabled()'方法。 – 2015-02-06 14:47:43