SwipeDragTreeRecyclerView 使用說明
功能
- 樹形結(jié)構(gòu) RecyclerView
- 支持滑動刪除
- 支持長按拖拽
- 支持單個 view 點擊或長按時拖拽
- 可開啟并更改滑動刪除背景色
- 可自由指定滑動刪除和拖拽操作的方向
- 展開關(guān)閉全部分組
下載
- Demo:下載
截圖
使用方法
-
添加jitpack庫
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
-
添加依賴
dependencies {
compile 'com.github.goweii:SwipeDragTreeRecyclerView:v1.0.0'
}
-
在xml布局文件中使用官方RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/swipe_drag_tree_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</android.support.v7.widget.RecyclerView>
-
繼承 TreeState 增加幾個靜態(tài)變量裂垦,用于標(biāo)識 item 的類別
當(dāng)然顺囊,你的數(shù)據(jù)應(yīng)該存放在 TreeState 中
public class TestTreeState extends TreeState {
public static final int TYPE_ONE = 1;
public static final int TYPE_TEO = 2;
public static final int TYPE_THREE = 3;
public static final int TYPE_FOUR = 4;
}
-
用你的 adapter 繼承 BaseSwipeDragTreeAdapter 實現(xiàn)幾個方法
-
initIds()
在這個方法中你應(yīng)該調(diào)用下面2個方法完成相關(guān)初始化-
putTypeLayoutViewIds(int viewType, int layoutId, int[] viewIds, int[] clickFlags)
這4個參數(shù)的含義為:- viewType
類別 繼承 TreeState 增加的靜態(tài)變量 - layoutId
布局id - viewIds
布局中需要用到的 view 的 id - clickFlags
設(shè)置 view 是否需要點擊事件,設(shè)置為 null 時默認不開啟長按和單擊蕉拢, ClickFlag 為 adapter 的靜態(tài)內(nèi)部類特碳,你直接使用即可
- viewType
-
putTypeStartDragViewIds(int viewType, @IdRes int[] viewIds, int[] startDragFlags)
如果你想讓某一個 view 在點擊或者長按時實現(xiàn)拖拽,而不是在長按整個 item 時晕换,應(yīng)該調(diào)用這個方法完成配置- viewType
布局類型 - viewIds
拖拽操作的 view 的 id - startDragFlags
拖拽標(biāo)志午乓,StartDragFlag 為 adapter 的靜態(tài)內(nèi)部類,你直接使用即可
- viewType
-
putTypeLayoutViewIds(int viewType, int layoutId, int[] viewIds, int[] clickFlags)
-
bindData(BaseViewHolder holder, TypeData data)
你應(yīng)該調(diào)用 holder.getItemViewType() 方法得到自定義的 item 的類別闸准,依據(jù)類別判斷 holder 綁定的數(shù)據(jù)類型益愈,然后調(diào)用 holder 的 getView 方法獲取 view 實例進行數(shù)據(jù)綁定
-
initIds()
public class TestBaseSwipeDragTreeAdapter extends BaseSwipeDragTreeAdapter {
private final int mOrientationType;
public TestBaseSwipeDragTreeAdapter(int orientationType) {
super();
mOrientationType = orientationType;
}
@Override
public void initIds() {
putTypeLayoutViewIds(TestTreeState.TYPE_ONE, R.layout.item1_swipe_drag_tree_recycler_view,
new int[]{R.id.item1_sdtrv_tv}, null);
putTypeLayoutViewIds(TestTreeState.TYPE_TEO, R.layout.item2_swipe_drag_tree_recycler_view,
new int[]{R.id.item2_sdtrv_tv}, null);
putTypeLayoutViewIds(TestTreeState.TYPE_THREE, R.layout.item3_swipe_drag_tree_recycler_view,
new int[]{R.id.item3_sdtrv_tv}, null);
putTypeLayoutViewIds(TestTreeState.TYPE_FOUR, R.layout.item4_swipe_drag_tree_recycler_view,
new int[]{R.id.item4_sdtrv_tv}, null);
putTypeLayoutViewIds(TestTreeState.TYPE_LEAF, R.layout.item5_swipe_drag_tree_recycler_view,
new int[]{R.id.item5_sdtrv_tv}, null);
putTypeStartDragViewIds(TestTreeState.TYPE_ONE,
new int[]{R.id.item1_sdtrv_tv}, null);
putTypeStartDragViewIds(TestTreeState.TYPE_TEO,
new int[]{R.id.item2_sdtrv_tv}, null);
putTypeStartDragViewIds(TestTreeState.TYPE_THREE,
new int[]{R.id.item3_sdtrv_tv}, null);
putTypeStartDragViewIds(TestTreeState.TYPE_FOUR,
new int[]{R.id.item4_sdtrv_tv}, null);
putTypeStartDragViewIds(TestTreeState.TYPE_LEAF,
new int[]{R.id.item5_sdtrv_tv}, null);
}
@Override
protected void bindData(BaseViewHolder holder, TypeData data) {
SwipeDragTreeViewHolder viewHolder = (SwipeDragTreeViewHolder) holder;
switch (holder.getItemViewType()) {
case TestTreeState.TYPE_ONE:
TextView textView0 = (TextView) viewHolder.getView(R.id.item1_sdtrv_tv);
textView0.setText((String) data.getData());
break;
case TestTreeState.TYPE_TEO:
TextView textView1 = (TextView) viewHolder.getView(R.id.item2_sdtrv_tv);
textView1.setText((String) data.getData());
break;
case TestTreeState.TYPE_THREE:
TextView textView2 = (TextView) viewHolder.getView(R.id.item3_sdtrv_tv);
textView2.setText((String) data.getData());
break;
case TestTreeState.TYPE_FOUR:
TextView textView3 = (TextView) viewHolder.getView(R.id.item4_sdtrv_tv);
textView3.setText((String) data.getData());
break;
case TestTreeState.TYPE_LEAF:
TextView textView4 = (TextView) viewHolder.getView(R.id.item5_sdtrv_tv);
textView4.setText((String) data.getData());
break;
default:
break;
}
}
}
-
在你的 activity 中調(diào)用 init() 方法為適配器綁定數(shù)據(jù)
mSwipeDragTreeRecyclerView.setLayoutManager(getLayoutManager());
mSwipeDragTreeRecyclerView.setAdapter(mTestBaseSwipeDragTreeAdapter);
mTestBaseSwipeDragTreeAdapter.init(mDatas);
Adapter 相關(guān)方法說明
-
init(ArrayList datas)
給適配器綁定數(shù)據(jù)
-
isMemoryExpandState()
獲取分組關(guān)閉后是否記憶子分組的展開狀態(tài)
-
setMemoryExpandState(boolean memoryExpandState)
設(shè)置分組關(guān)閉后是否記憶子分組的展開狀態(tài)
-
isAllExpand()
獲取是否已經(jīng)展開所有分組
-
expandAll()
展開所有分組
-
unExpandAll()
關(guān)閉所有分組
-
getPositions(int position)
獲取該 holder 位置所顯示數(shù)據(jù)在樹形結(jié)構(gòu)數(shù)據(jù)中所處的位置
-
setOnExpandChangeListener(OnExpandChangeListener onExpandChangeListener)
設(shè)置 item 展開狀態(tài)改變監(jiān)聽器
-
notifyItemSwipe(int position)
更新數(shù)據(jù)滑動刪除,在監(jiān)聽器中調(diào)用更新數(shù)據(jù)
-
notifyItemDrag(int currentPosition, int targetPosition)
更新數(shù)據(jù)拖拽移動,在監(jiān)聽器中調(diào)用更新數(shù)據(jù)
-
setOnItemSwipeListener(SwipeDragCallback.OnItemSwipeListener onItemSwipeListener)
設(shè)置滑動刪除監(jiān)聽器蒸其,應(yīng)該調(diào)用 notifyItemSwipe 方法更新數(shù)據(jù)顯示
-
setOnItemDragListener(SwipeDragCallback.OnItemDragListener onItemDragListener)
設(shè)置 item 拖拽監(jiān)聽器敏释,應(yīng)該調(diào)用 notifyItemDrag 方法更新數(shù)據(jù)顯示
-
setItemViewSwipeEnabled(boolean itemViewSwipeEnabled)
設(shè)置開啟關(guān)閉滑動刪除
-
setLongPressDragEnabled(boolean longPressDragEnabled)
設(shè)置開啟關(guān)閉長按拖拽
-
setSwipeBackgroundColorEnabled(boolean swipeBackgroundColorEnabled)
設(shè)置開啟關(guān)閉滑動刪除背景色
-
isItemViewSwipeEnabled()
獲取是否開啟滑動刪除
-
isLongPressDragEnabled()
獲取是否開啟長按拖拽
-
isSwipeBackgroundColorEnabled()
獲取是否開啟滑動刪除背景色
-
setSwipeBackgroundColor(@ColorInt int swipeBackgroundColor)
設(shè)置滑動刪除背景色顏色
-
setCustomSwipeFlag(int customSwipeFlag)
設(shè)置可以滑動刪除的方向,默認為垂直于滾動方向的2個方向
-
setCustomDragFlag(int customDragFlag)
設(shè)置可以拖拽的方向摸袁,線性布局默認為平行于滾動方向的2個方向钥顽,網(wǎng)格和流布局默認為上下左右4個方向都可以
-
setOnItemViewClickListener(OnItemViewClickListener onItemViewClickListener)
設(shè)置 itemView 點擊監(jiān)聽器
-
setOnItemViewLongClickListener(OnItemViewLongClickListener onItemViewLongClickListener)
設(shè)置 itemView 長按監(jiān)聽器
-
setOnCustomViewClickListener(OnCustomViewClickListener onCustomViewClickListener)
設(shè)置 item 子 view 點擊監(jiān)聽器,需要在適配器的 initIds() 方法中開啟
-
setOnCustomViewLongClickListener(OnCustomViewLongClickListener onCustomViewLongClickListener)
設(shè)置 item 子 view 長按監(jiān)聽器靠汁,需要在適配器的 initIds() 方法中開啟
注意
- 發(fā)現(xiàn) bug 請聯(lián)系 QQ302833254