可拖动、可滑动的组件===》RecyclerView

最近因为项目需要所以碰到了一个需要重新排序的ListView布局,然后就去网上找了一个严振杰(noHttp的作者)写的一个demo,运行成功之后就去看代码,看了半天感觉代码的可读性很差,本来很简单的事被他封装了好几层实现,所以我就开始研究了代码了。

实际上这个可交换item位置也可以滑动删除的控件是用RecyclerView实现的。下面就给大家从代码开始分析一下实现原理。

这个RecyclerView用Studio开发的童鞋们呢就直接依赖下就好了  具体怎么使用我就不跟大家细说了  我就开始捞干货说了啊。首先看主程序的布局,很简单,我为了让大家能够看到RecyclerView我上下放了两个TextView。代码就不贴了  太占篇幅了。最后我会把我的代码分享给大家,希望大家可以看完文章。

先看效果↓

看主Activity代码,我直接贴上代码,注释我已经写的很清楚了

/**
 * @author 宋鑫
 * Created by admin on 2017/1/3.
 * 主界面
 * 布局很简单
 */
public class MainActivity extends AppCompatActivity  implements StartDragListener{
    private RecyclerView myrecycler;
    private ItemTouchHelper touchHelper;//这个就是RecyclerView实现拖动和滑动的帮助类
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 制造点假数据
         */
        List<User> list = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            User u = new User();
            u.setName("用户"+i);
            u.setPhone("1324044535"+i);
            u.setAddress("丰台科技园"+i+"号楼");
            list.add(u);
        }
        myrecycler = (RecyclerView) findViewById(R.id.myRecycler);//实例化组件
        myrecycler.setLayoutM
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
功能树形结构 RecyclerView支持滑动删除支持长按拖拽支持单个 view 点击或长按时拖拽可开启并更改滑动删除背景色可自由指定滑动删除和拖拽操作的方向展开关闭全部分组下载Demo:下载截图使用方法添加jitpack库//build.gradle(Project:)  allprojects {       repositories {     ...      maven { url 'https://www.jitpack.io' }      }     }添加依赖 //build.gradle(Module:)dependencies {    compile 'com.github.goweii:SwipeDragTreeRecyclerView:v1.2.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 增加几个静态变量,用于标识 item 的类别当然,你的数据应该存放在 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 实现几个方法putTypeLayoutViewIds(int viewType, int layoutId, int[] viewIds, int[] clickFlags) 这4个参数的含义为:putTypeStartDragViewIds(int viewType, @IdRes int[] viewIds, int[] startDragFlags) 如果你想让某一个 view 在点击或者长按时实现拖拽,而不是在长按整个 item 时,应该调用这个方法完成配置viewType 类别 继承 TreeState 增加的静态变量layoutId 布局idviewIds 布局中需要用到的 view 的 idclickFlags 设置 view 是否需要点击事件,设置为 null 时默认不开启长按和单击, ClickFlag 为 adapter 的静态内部类,你直接使用即可viewType 布局类型viewIds 拖拽操作的 view 的 idstartDragFlags 拖拽标志,StartDragFlag 为 adapter 的静态内部类,你直接使用即可initIds() 在这个方法中你应该调用下面2个方法完成相关初始化bindData(BaseViewHolder holder, TypeData data) 你应该调用 holder.getItemViewType() 方法得到自定义的 item 的类别,依据类别判断 holder 绑定的数据类型,然后调用 holder 的 getView 方法获取 view 实例进行数据绑定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 中调用 init() 方法为适配器绑定数据mSwipeDragTreeRecyclerView.setLayoutManager(getLayoutManager()); mSwipeDragTreeRecyclerView.setAdapter(mTestBaseSwipeDragTreeAdapter); mTestBaseSwipeDragTreeAdapter.init(mDatas);Adapter 相关方法说明init(ArrayList datas)给适配器绑定数据isMemoryExpandState()获取分组关闭后是否记忆子分组的展开状态setMemoryExpandState(boolean memoryExpandState)设置分组关闭后是否记忆子分组的展开状态isAllExpand()获取是否已经展开所有分组expandAll()展开所有分组collapseAll()关闭所有分组getPositions(int position)获取该 holder 位置所显示数据在树形结构数据中所处的位置setOnExpandChangeListener(OnExpandChangeListener onExpandChangeListener)设置 item 展开状态改变监听器notifyItemSwipe(int position)更新数据滑动删除,在监听器中调用更新数据notifyItemDrag(int currentPosition, int targetPosition)更新数据拖拽移动,在监听器中调用更新数据setOnItemSwipeListener(SwipeDragCallback.OnItemSwipeListener onItemSwipeListener)设置滑动删除监听器,应该调用 notifyItemSwipe 方法更新数据显示setOnItemDragListener(SwipeDragCallback.OnItemDragListener onItemDragListener)设置 item 拖拽监听器,应该调用 notifyItemDrag 方法更新数据显示setItemViewSwipeEnabled(boolean itemViewSwipeEnabled)设置开启关闭滑动删除setLongPressDragEnabled(boolean longPressDragEnabled)设置开启关闭长按拖拽setSwipeBackgroundColorEnabled(boolean swipeBackgroundColorEnabled)设置开启关闭滑动删除背景色isItemViewSwipeEnabled()获取是否开启滑动删除isLongPressDragEnabled()获取是否开启长按拖拽isSwipeBackgroundColorEnabled()获取是否开启滑动删除背景色setSwipeBackgroundColor(@ColorInt int swipeBackgroundColor)设置滑动删除背景色颜色setCustomSwipeFlag(int customSwipeFlag)设置可以滑动删除的方向,默认为垂直于滚动方向的2个方向setCustomDragFlag(int customDragFlag)设置可以拖拽的方向,线性布局默认为平行于滚动方向的2个方向,网格和流布局默认为上下左右4个方向都可以setOnItemViewClickListener(OnItemViewClickListener onItemViewClickListener)设置 itemView 点击监听器setOnItemViewLongClickListener(OnItemViewLongClickListener onItemViewLongClickListener)设置 itemView 长按监听器setOnCustomViewClickListener(OnCustomViewClickListener onCustomViewClickListener)设置 item 子 view 点击监听器,需要在适配器的 initIds() 方法中开启setOnCustomViewLongClickListener(OnCustomViewLongClickListener onCustomViewLongClickListener)设置 item 子 view 长按监听器,需要在适配器的 initIds() 方法中开启注意发现 bug 请联系 QQ302833254

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值