Android一步一步带你实现RecyclerView的拖拽和侧滑删除功能

本文详述如何在Android中使用RecyclerView和ItemTouchHelper实现拖拽及侧滑删除功能。从搭建基本框架到编写Adapter,再到实现拖拽和删除功能,最后处理细节,包括拖动图标触发拖拽、拖拽时改变item背景颜色和侧滑删除的视觉效果。文章通过一个开源项目Android-ItemTouchHelper-Demo进行实战教学。
摘要由CSDN通过智能技术生成

先上效果图:
这里写图片描述

本篇文章我们来学习一个开源项目Android-ItemTouchHelper-Demo
这个项目使用了RecyclerView的ItemTouchHelper类实现了Item的拖动和删除功能,ItemTouchHelper是v7包下的一个类,我们看一下他的介绍

This is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.

这是一个工具类,专门用来配合RecyclerView实现滑动删除和拖拽功能的类

先搭起一个小框架

我们从头开始,一点一点实现最终的功能,首先我们先搭起一个小框架,我们的首页显示两个Item,一个点击进入ListView形式的RecyclerView;一个点击进入GridView形式的RecyclerView。
这里写图片描述

我们先在values/strings.xml中定义一个数组

 <array name="main_items">
        <item>List - Basic Drag and Swipe</item>
        <item>Grid - Basic Drag</item>
 </array>

再创建一个MainFragment继承自ListFragment

public class MainFragment extends ListFragment {
   
    private onListItemClickListener mListItemClickListener;
    //定义一个回调接口,用来将点击事件传回他的宿主Activity去做,Fragment中不做具体的逻辑操作
    public interface onListItemClickListener{
   
        void onListItemClick(int position);
    }
    public MainFragment(){

    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        //他的宿主Activity将实现onListItemClickListener接口
        //使用getActivity()获得的宿主Activity,将他强转成onListItemClickListener接口
       mListItemClickListener = (onListItemClickListener)getActivity();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //获得我们在strings.xml中定义个数组
        final String[] items = getResources().getStringArray(R.array.main_items);
        //创建适配器
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, items);
        //设置适配器
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        if (mListItemClickListener!=null){
            //由于宿主Activity实现了onListItemClickListener接口
            //因此调用的是宿主Activity的onListItemClick方法
            //并且将点击的item的position传给Activity
            mListItemClickListener.onListItemClick(position);
        }
    }
}

我们再创建一个RecyclerListFragment,我们先不做具体的实现,只是先把架子搭起来

public class RecyclerListFragment extends Fragment {
   
    public RecyclerListFragment(){}

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return new RecyclerView(container.getContext());
    }
}

再来一个RecyclerGridFragment

public class RecyclerGridFragment extends Fragment {
   
    public RecyclerGridFragment(){}

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return new RecyclerView(container.getContext());
    }
}

好了,Fragment我们已经准备好了,就差一个宿主Activity了,现在我们就来创建MainActivity,并且实现MainFragment.OnListItemClickListener接口,重写onListItemClick方法

public class MainActivity extends AppCompatActivity implements MainFragment.onListItemClickListener{
   

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //当savedInstanceState为null时才new一个MainFragment出来
        //否则每次旋转屏幕都会new出来一个
        if (savedInstanceState == null){
            MainFragment fragment = new MainFragment();
            //用add将MainFragment添加到framelayout上
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.content,fragment)
                    .commit();
        }
    }


    @Override
    public void onListItemClick(int position) {
        //当MainFragment的Item被点击后,就会回调此方法
        //在此方法中写真正的逻辑,这样Activity和Fragment
        //之间就是松耦合关系,MainFragment可以复用
        Fragment fragment = null;
        switch (position){
            case 0:
                //当点击第一个item时候,new一个RecyclerListFragment
                fragment = new RecyclerListFragment();
                break;
            case 1:
                //当点击第二个item时候,new一个RecyclerGridFragment
                fragment = new RecyclerGridFragment();
                break;
        }
        //这次用replace,替换framelayout的布局,也就是MainFragment
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content,fragment)
                .addToBackStack(null)
                .commit();
    }
}

activity_main.

评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值