拖拽排序滑动删除列表

1、相关知识点:

(1)RecyclerView的基本用法:布局、适配器、数据绑定

(2)RecyclerView的分割线添加

(3)RecyclerView的item动画添加

(4)RecyclerView的手势监听

(5)回调机制

2、核心思想:

(1)为什么选择RecyclerView,因为它除了可以实现ListView、GridView、瀑布流布局之间的状态切换,同时将以前列表组件的中适配器、Activity、ViewHolder、事件处理等属性进行了高度解耦。

(2)ItemTouchHelper监听列表被触摸事件,上下方向为拖拽和活动列表行为,其中后者属于系统默认行为不需要处理,如果是拖拽排序,通过回调item中相应位置的数据进行位置互换,同时刷新列表。

(3)同样,左右滑动代码删除行为,通过手势监听,回调适配器对相关item的数据在列表中进行相应的删除操作,同时刷新列表。

3、核心技术:

(1)RecyclerView的触摸事件绑定

(2)回调机制实现用户的UI交互

4、核心代码:

(1)RecyclerView初始化设置:

public class MainActivity extends FragmentActivity implements startDragListener {

    RecyclerView drag_swipe_recyclerView;
    ItemTouchHelper helper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //构造虚拟数据
        List<String> data = new ArrayList<String>();
        for (char i= 'A'; i<='Z'; ++i)
        {
            data.add(""+i);
        }
        //设置为线性列表布局
        drag_swipe_recyclerView = (RecyclerView)findViewById(R.id.drag_swipe_recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //设置为垂直滑动的列表
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        drag_swipe_recyclerView.setLayoutManager(layoutManager);
        //设置各个布局高度一致加快加载速度
        drag_swipe_recyclerView.setHasFixedSize(true);
        //初始化列表
        DragSwipeListAdapter adapter = new DragSwipeListAdapter(data, this);
        drag_swipe_recyclerView.setAdapter(adapter);
        //设置列表删除和添加时的动画
        drag_swipe_recyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置列表每个Item的间隔线
        drag_swipe_recyclerView.addItemDecoration(new DividerItemDecoration(this, OrientationHelper.VERTICAL));
        // 设置点击事件
        adapter.setItemClickListener(new onItemClickListener() {
            @Override
            public void onItemClick(Object obj) {
                Toast.makeText(MainActivity.this, "点击了"+obj.toString(), Toast.LENGTH_SHORT).show();
            }
        });
        //设置触摸监听事件
        ItemTouchHelper.Callback callback = new DraySwipeTouchCallBack(adapter);
        helper = new ItemTouchHelper(callback);
        helper.attachToRecyclerView(drag_swipe_recyclerView);
    }

    @Override
    public void startDragListener(RecyclerView.ViewHolder holder) {
        if (helper != null)
        {
            helper.startDrag(holder);
        }
    }
}
/**
 * Created by czh on 2016/5/12.14:26.
 * Tip: Android_Study
 */
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    //采用系统内置的风格的分割线
    private static final int[] attrs=new int[]{android.R.attr.listDivider};
    private Drawable mDivider;
    private int orientation;
    public DividerItemDecoration(Context context, int orientation) {
        TypedArray typedArray=context.obtainStyledAttributes(attrs);
        mDivider=typedArray.getDrawable(0);
        typedArray.recycle();
        this.orientation=orientation;
    }
    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        drawHDeraction(c,parent);
        drawVDeraction(c,parent);
    }
    /**
     * 绘制水平方向的分割线
     * @param c
     * @param parent
     */
    private void drawHDeraction(Canvas c,RecyclerView parent){
        int left=parent.getPaddingLeft();
        int right=parent.getWidth()-parent.getPaddingRight();
        int childCount=parent.getChildCount();
        for(int i=0;i<childCount;i++){
            View child=parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();
            int top=child.getBottom()+layoutParams.bottomMargin;
            int bottom=top+mDivider.getIntrinsicHeight();
            mDivider.setBounds(left,top,right,bottom);
            mDivider.draw(c);
        }
    }
    /**
     * 绘制垂直方向的分割线
     * @param c
     * @param parent
     */
    private void drawVDeraction(Canvas c,RecyclerView parent){
        int top=parent.getPaddingTop();
        int bottom=parent.getHeight()-parent.getPaddingBottom();
        int childCount=parent.getChildCount();
        for(int i=0;i<childCount;i++){
            View child=parent.getChildAt(i);
            RecyclerView.LayoutParams layoutParams=(RecyclerView.LayoutParams)child.getLayoutParams();
            int left=child.getRight()+layoutParams.rightMargin;
            int right=left+mDivider.getIntrinsicWidth();
            mDivider.setBounds(left,top,right,bottom);
            mDivider.draw(c);
        }
    }
    @Override
    public void getItemOffsets(Rect outRect,View view, RecyclerView parent, RecyclerView.State state) {
        if(OrientationHelper.HORIZONTAL==orientation){
            outRect.set(0, 0,mDivider.getIntrinsicWidth(), 0);
        }else {
            outRect.set(0, 0, 0,mDivider.getIntrinsicHeight());
        }
    }
}
(3)事件处理


/**
 * Created by czh on 2016/5/10.
 * 拖拽排序+滑动删除列表手势监听事件
 */
public class DraySwipeTouchCallBack  extends Callback {

    private ISuperItemOpeartion itemMove;

    public DraySwipeTouchCallBack(ISuperItemOpeartion adapter) {
        this.itemMove = adapter;
    }

    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        //设置列表滑动方向
        int dragFlag = ItemTouchHelper.DOWN|ItemTouchHelper.UP;
        int swipeFlag = ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;
        return makeMovementFlags(dragFlag, swipeFlag);
    }

    /**
     *
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

        //更换RecyclerView中两个对象的在数据的位置
        //更新RecyclerView
        itemMove.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        itemMove.onItemSwipe(viewHolder.getAdapterPosition());
    }
}
如果想要更深入的理解ItemTouchHelper能做什么事情,请查看我的另一篇关于ItemTouchHelper解析的博客:http://blog.csdn.net/dnnis/article/details/51743904
源码地址:https://github.com/PerterJu/DragSwipeRecyclerView.git

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView 是 Android SDK 自带的一个 UI 组件,用于展示列数据,是 ListView 的升级版。相比于 ListView,RecyclerView 更为灵活,可以自定义布局和动画效果,支持横向和纵向滚动,支持多种布局管理器等。下面简单介绍 RecyclerView 的用法。 1. 引入依赖 在项目的 build.gradle 文件中添加以下依赖: ``` dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' } ``` 2. 在布局文件中添加 RecyclerView ``` <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 3. 创建 Adapter Adapter 是 RecyclerView 中一个重要的概念,用于绑定数据和视图,将数据渲染到 RecyclerView 中。需要继承 RecyclerView.Adapter 类,实现以下方法: - onCreateViewHolder(ViewGroup parent, int viewType):创建 ViewHolder,即创建列项的视图。 - onBindViewHolder(ViewHolder holder, int position):绑定数据到 ViewHolder,即将数据渲染到视图中。 - getItemCount():获取列项的数量。 ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mDataList; public MyAdapter(List<String> dataList) { mDataList = dataList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); ViewHolder holder = new ViewHolder(view); return holder; } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.mTextView.setText(mDataList.get(position)); } @Override public int getItemCount() { return mDataList.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(View itemView) { super(itemView); mTextView = itemView.findViewById(R.id.text_view); } } } ``` 4. 设置 LayoutManager LayoutManager 用于设置 RecyclerView 的布局方式,包括线性布局、网格布局、瀑布流布局等。可以通过以下方法设置: ``` // 线性布局 LinearLayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); // 网格布局 GridLayoutManager layoutManager = new GridLayoutManager(this, 3); recyclerView.setLayoutManager(layoutManager); // 瀑布流布局 StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(layoutManager); ``` 5. 设置 ItemDecoration ItemDecoration 用于为 RecyclerView 中的列项添加分割线、间距等装饰效果。可以通过以下方法设置: ``` // 添加分割线 recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); // 添加间距 recyclerView.addItemDecoration(new SpaceItemDecoration(10)); ``` 6. 设置 Adapter 将 Adapter 设置到 RecyclerView 中: ``` MyAdapter adapter = new MyAdapter(mDataList); recyclerView.setAdapter(adapter); ``` 以上就是 RecyclerView 的基本用法。如果需要实现列项的动画效果、滑动删除拖拽排序等功能,还需要通过 ItemAnimator、ItemTouchHelper 等配合使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值