先上效果图:
本篇文章我们来学习一个开源项目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.