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