某天学习RecyclerView正好看到这样一个效果,感觉这个小功能实现应该不难而且也能巩固知识。
在开发过程中RecylerView常被用来代替ListView和GirdView实现更强大的功能,这里不花太多篇幅解释RecylerView。
1.布局文件
本实例布局比较简单,只使用到了两个TextView和RecylerView,XML文件如下:
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_vertical"
android:layout_width="match_parent"
android:layout_height="200dp"
android:scrollbars="vertical"/>
<View
android:layout_width="match_parent"
android:layout_height="50dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="horizontal swipe"
android:textSize="20sp"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recy_horizontal"
android:layout_width="match_parent"
android:layout_height="200dp" />
2.创建接口
public interface IOperationData {
//交换数据
void onItemMove (int fromPosition, int toPosition);
//删除数据
void onItemDissmiss(int position);
}
3.创建VerticalRecylerAdapter并实现接口
public class VerticalRecylerAdapter extends RecyclerView.Adapter implements IOperationData {
private Context mContext;
private List<CountryBean> mList;
private String[] mData;
private RecylerHolder RecylerHolder;
public VerticalRecylerAdapter(Context context, List<CountryBean> mList){
this.mContext = context;
this.mList = mList;
mData = context.getResources().getStringArray(R.array.countries);
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//加载布局,创建ViewHolder
View view = LayoutInflater.from(mContext).inflate(R.layout.vertical_list_item,parent,false);
RecylerHolder = new VerticalRecylerAdapter.RecylerHolder(view);
return RecylerHolder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
//填充控件数据
RecylerHolder.textView.setText(mData[position]);
}
@Override
public int getItemCount() {
//返回List长度
return mList != null ? mList.size() : 0;
}
//实现接口
@Override
public void onItemMove(int fromPosition, int toPosition) {
Collections.swap(mList,fromPosition,toPosition);
notifyItemMoved(fromPosition,toPosition);
}
@Override
public void onItemDissmiss(int position) {
mList.remove(position);
notifyItemRemoved(position);
}
//内部类,绑定控件
class RecylerHolder extends RecyclerView.ViewHolder{
private TextView textView;
public RecylerHolder(@NonNull View itemView) {
super(itemView);
textView = (TextView)itemView.findViewById(R.id.item);
}
}
}
4.创建TouchHelperCallback并继承ItemTouchHelper.Callback
public class HorizontalTouchHelperCallback extends androidx.recyclerview.widget.ItemTouchHelper.Callback{
private HorizontalRecylerAdapter mRecylerAdapter;
public HorizontalTouchHelperCallback(HorizontalRecylerAdapter recylerAdapter){
this.mRecylerAdapter = recylerAdapter;
}
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;//定义拖拽方向
int swipeFlags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;//定义滑动方向
return makeMovementFlags(dragFlags,swipeFlags);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
mRecylerAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
mRecylerAdapter.onItemDissmiss(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE){
final float alpha = 1 - Math.abs(dX) / (float)viewHolder.itemView.getHeight();
viewHolder.itemView.setAlpha(alpha);
}
}
}
5.MainActivity
private void initData() {
recyVertical = (RecyclerView)findViewById(R.id.recy_vertical);
recyHorizontal = (RecyclerView)findViewById(R.id.recy_horizontal);
mData = getResources().getStringArray(R.array.countries);
for (int i = 0;i<mData.length; i++){
CountryBean countryBean = new CountryBean();
countryBean.setCountry(mData[i]);
mCountryList.add(countryBean);
}
//实例化RecylerAdapter
VerticalRecylerAdapter verticalApater = new VerticalRecylerAdapter(this,mCountryList);
//设置布局管理器
LinearLayoutManager verticalManager = new LinearLayoutManager(this);
recyVertical.setLayoutManager(verticalManager);
recyVertical.setAdapter(verticalApater);
//实例化Callback
TouchHelperCallback verticalCallback = new TouchHelperCallback(verticalApater);
ItemTouchHelper verticalTouchHelper = new ItemTouchHelper(verticalCallback);
verticalTouchHelper.attachToRecyclerView(recyVertical);
}
到此,上下滑动拖拽、侧滑删除的效果就已经实现了,如果想做一个水平滑动拖拽、上下移动删除的效果,只需要按照相同原理在方法中设置LinearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);可实现水平滑动,
在getMovementFlags定义拖拽和滑动方向即可实现