Android 用RecyclerView实现的流式布局,一款针对可拖动Tag的布局

Android 用RecyclerView实现的流式布局,一款针对可拖动Tag的布局流式布局 这个概念在移动端或者前端开发中很常见 特别是在多标签的展示中 往往起到了关键的作用 公司最近要做一个标签管理 标签可删除 可添加 长按可以拖动 网上很多流式布局的列子 大部分都不能满足需求 大部分都不能拖动 有的可以拖动但是都是 GridView 式布局所以不能满足流式布局的基本要求 所以自己封装一个可删除 可添加 长按可以拖动流式布局 为甚麽选择在 RecyclerView 基础上

  流式布局, 这个概念在移动端或者前端开发中很常见,特别是在多标签的展示中, 往往起到了关键的作用。公司最近要做一个标签管理,标签可删除,可添加,长按可以拖动。网上很多流式布局的列子,大部分都不能满足需求,大部分都不能拖动,有的可以拖动但是都是GridView式布局所以不能满足流式布局的基本要求,所以自己封装一个可删除,可添加,长按可以拖动流式布局。

demo:Android用RecyclerView实现的流式布局,一款针对可拖动Tag的布局-Android文档类资源-CSDN文库

为甚麽选择在RecyclerView基础上封装那,原因很简单:原生RecyclerView满足可拖拽,删除,添加。但是RecyclerView布局管理器满足满足不了需求,所以需要自定义:

ChipsLayoutManager spanLayoutManager = ChipsLayoutManager.newBuilder(activity) .setOrientation(ChipsLayoutManager.HORIZONTAL) .build();

这个ChipsLayoutManager在这里也不再多讲,详解都在github:GitHub – BelooS/ChipsLayoutManager: ANDROID. ChipsLayoutManager (SpanLayoutManager, FlowLayoutManager). A custom layout manager for RecyclerView which mimicric TextView span behaviour, flow layouts behaviour with support of amazing recyclerView features

适配器代码

public class TagReAdapter extends BaseRecyclerAdapter 
  
    { SwipeMenuRecyclerView recyclerView; public TagReAdapter(Context context, List 
   
     mdatas) { super(context, mdatas); } @Override public RecyclerView.ViewHolder onCreate(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.tag_item, null); return new ViewHohler(view); } @Override public void onBind(RecyclerView.ViewHolder viewHolder, int position, ShortcutNameBean bean) { ViewHohler hohler= (ViewHohler) viewHolder; hohler.tvName.setText(bean.getKey()); hohler.imDel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { deleteClickListener.ClickListener(position,bean); } }); } //拖拽的主要实现方法 public void move(int origin, int target) { if (origin < target) { for (int i = origin; i < target; i++) { Collections.swap(getDatas(), i, i + 1); } } if (origin > target) { for (int i = origin; i > target; i--) { Collections.swap(getDatas(), i, i - 1); } } notifyItemMoved(origin, target); } class ViewHohler extends XRecyclerView.ViewHolder { TextView tvName; @BindView(R.id.img_del) ImageView imDel; @BindView(R.id.container) RelativeLayout container; public ViewHohler(View itemView) { super(itemView); ButterKnife.bind(this, itemView); tvName=itemView.findViewById(R.id.tv_tag); } } public interface DeleteClickListener{ void ClickListener(int position,ShortcutNameBean bean); } private DeleteClickListener deleteClickListener; public void setDeleteClickListener(DeleteClickListener deleteClickListener) { this.deleteClickListener = deleteClickListener; } } 
    
  

RecyclerView提供的拖拽方法
 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback); itemTouchHelper.attachToRecyclerView(mBinding.recyclerView); private ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(ItemTouchHelper.LEFT | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT | ItemTouchHelper.UP , ItemTouchHelper.ACTION_STATE_IDLE) { View view; @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //获得两个Item的位置 int originPosition = viewHolder.getAdapterPosition(); int targetPistion = target.getAdapterPosition(); //交换Adapter中对应的位置 adapter.move(originPosition, targetPistion); flag = true; return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } //长按选中动画 @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { super.onSelectedChanged(viewHolder, actionState); if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(viewHolder.itemView, "scaleX", 1.0f, 1.2f); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(viewHolder.itemView, "scaleY", 1.0f, 1.2f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(300); animatorSet.playTogether(objectAnimatorX, objectAnimatorY); animatorSet.start(); view = viewHolder.itemView; } if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) { ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(view, "scaleX", 1.2f, 1.0f); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(view, "scaleY", 1.2f, 1.0f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(300); animatorSet.playTogether(objectAnimatorX, objectAnimatorY); animatorSet.start(); adapter.notifyDataSetChanged(); } } };

主要实现的思路和主要代码都贴出来了,话不多说直接上图把

变化前

Android 用RecyclerView实现的流式布局,一款针对可拖动Tag的布局

变化后

Android 用RecyclerView实现的流式布局,一款针对可拖动Tag的布局

项目地址:(1条消息) Android用RecyclerView实现的流式布局,一款针对可拖动Tag的布局-Android文档类资源-CSDN文库

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223809.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:23
下一篇 2026年3月17日 下午1:23


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号