RecyclerView - 拖放 - 将项目移动到另一个项目上 占位符

如何解决RecyclerView - 拖放 - 将项目移动到另一个项目上 占位符

我有一个适配器、Recyclerview 和 itemtouchhelper。 我想制作占位符,由于移动,可以在其上放置物品。 占位符现在作为空元素制作。但是不知道怎么把元素直接放在这个上面。

enter image description here

我的适配器:

public class DateTimeAdapter extends RecyclerView.Adapter<MainHolder> implements itemtouchhelperAdapter {
    private List<MainItem> values;
    private RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();
    private Activity context;
    private final OnStartDragListener mDragStartListener;
    private boolean initEmpty = false;

    public DateTimeAdapter(Activity context,List<MainItem> values,OnStartDragListener dragListener) {
        this.values = values;
        this.context = context;
        mDragStartListener = dragListener;
    }


    @NonNull
    @Override
    public MainHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
        View view;
        switch (viewType){
            case (Constants.ITEM_HEADER_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.list_group_item,parent,false);
                return new HeaderHolder(view);
            case (Constants.ITEM_EVENT_TEXT_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.item_wo_items,false);
                return new ItemHolder(view);
            case (Constants.ITEM_PLACEHOLDER_VIEWTYPE):
                view = LayoutInflater.from(context).inflate(R.layout.item_placeholder,false);
                return new PlaceHolder(view);
            default: throw new IllegalArgumentException();
        }
    }

    @Override
    public void onBindViewHolder(@NonNull final MainHolder holder,int position) {
        holder.setData(values.get(position));

        if (holder.getItemViewType() == Constants.ITEM_PLACEHOLDER_VIEWTYPE){

        }
    }


    @Override
    public int getItemCount() {
        return values.size();
    }

    @Override
    public int getItemViewType(int position) {
        return values.get(position).getViewType();
    }

    protected LocalTime getStartTimebyHeader(int position){
        ListIterator<MainItem> listIterator = values.listIterator(position);
        while (listIterator.hasPrevIoUs()){
            MainItem t = listIterator.prevIoUs();
            if (t.getHeaderItem() != null){
                DateTimeFormatter parse = new DateTimeFormatterBuilder().appendPattern("HH:mm").toFormatter();
                LocalTime localTime = LocalTime.parse(t.getHeaderItem().getHeaderText(),parse);
                return localTime;
            }
        }
        return null;
    }



    protected LocalTime getEndTimebyHeader(int position){
        ListIterator<MainItem> listIterator = values.listIterator(position);
        while (listIterator.hasNext()){
            MainItem t = listIterator.next();
            if (t.getHeaderItem() != null){
                DateTimeFormatter parse = new DateTimeFormatterBuilder().appendPattern("HH:mm").toFormatter();
                LocalTime localTime = LocalTime.parse(t.getHeaderItem().getHeaderText(),parse);
                return localTime;
            }
        }
        return null;
    }


    @Override
    public boolean onItemmove(int fromPosition,int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(values,i,i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(values,i - 1);
            }
        }
        notifyItemmoved(fromPosition,toPosition);

        return true;
    }

    @Override
    public void onItemdismiss(int position) {
        values.remove(position);
        notifyItemRemoved(position);
    }
}

我的 itemtouchhelper

 itemtouchhelper.SimpleCallback simpleCallback = new itemtouchhelper.SimpleCallback(0,0) {


            @Override
            public boolean canDropOver(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder current,@NonNull RecyclerView.ViewHolder target) {
                if (target.getAdapterPosition() != 0 && target.getAdapterPosition() != dta.getItemCount()-1)
                    return true;
                return false;
            }

            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder,@NonNull RecyclerView.ViewHolder target) {
                Log.d("onMove",Integer.toString(viewHolder.getAdapterPosition()) + " - " + Integer.toString(target.getAdapterPosition()));
                dta.onItemmove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
                return true;

            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder,int direction) {

            }

            @Override
            public int getMovementFlags(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder) {
                int dragFlags =  viewHolder.getItemViewType() == Constants.ITEM_EVENT_TEXT_VIEWTYPE ? itemtouchhelper.UP | itemtouchhelper.DOWN : 0;
                int swipeFlags =  viewHolder.getItemViewType() == Constants.ITEM_EVENT_TEXT_VIEWTYPE ? itemtouchhelper.START | itemtouchhelper.END : 0;
                return makeMovementFlags(dragFlags,swipeFlags);
            }

            @Override
            public void clearView(@NonNull RecyclerView recyclerView,@NonNull RecyclerView.ViewHolder viewHolder) {
                showingDatas.get(viewHolder.getAdapterPosition()).getEventItem().setTimeS(dta.getStartTimebyHeader(viewHolder.getAdapterPosition()));
                showingDatas.get(viewHolder.getAdapterPosition()).getEventItem().setTimeE(dta.getEndTimebyHeader(viewHolder.getAdapterPosition()));
                dta.notifyItemChanged(viewHolder.getAdapterPosition());
                super.clearView(recyclerView,viewHolder);
            }
        };

        itemtouchhelper itemtouchhelper = new itemtouchhelper(simpleCallback);
        itemtouchhelper.attachToRecyclerView(rvPlan);

我该怎么做?

解决方法

问题已解决:数据类用于区分普通视图和占位符视图。在适配器中使用以下列表:

data class MyData(var type:Int,var name: String)
val list = mutableListOf(MyData(0,"PlaceHolder"),MyData(1,"Normal"),"Noraml"),MyData(0,"Place Holder"),"Normal"))

自定义项目触摸监听器类:

    ItemTouchHelper(object : RecyclerViewDragDetector() {
        override fun onMove(recyclerView: RecyclerView,viewHolder: RecyclerView.ViewHolder,target: RecyclerView.ViewHolder): Boolean {

            if (adapter.getItemViewType(viewHolder.adapterPosition) == 1){
                if (adapter.getItemViewType(target.adapterPosition)!= 1){

                    list[target.adapterPosition].type = 1
                    list[target.adapterPosition].name = "Normal"
                    adapter.notifyItemChanged(target.adapterPosition)
                    list.removeAt(viewHolder.adapterPosition)
                    adapter.notifyDataSetChanged()
                }
            }
            return true
        }
        override fun isLongPressDragEnabled(): Boolean {
            return true
        }
    }).attachToRecyclerView(recyclerView)

根据您的需要更换适配器。我的示例适配器如下所示:

    inner class MyAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>(){
    private val viewTypeHeader = 0
    private val viewTypeNormal = 1
    inner class MyHolder(view: View): RecyclerView.ViewHolder(view){
        val textView: TextView = view.findViewById(R.id.normal_tv)
        fun bind(myData: MyData){
            textView.text = myData.name
        }
    }
    inner class MyHeaderHolder(view:View): RecyclerView.ViewHolder(view){
        val textView: TextView = view.findViewById(R.id.header_tv)
        fun bind(myData: MyData){
            textView.text = myData.name
        }
    }
    override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RecyclerView.ViewHolder {
        return if (viewType == viewTypeHeader){
            val view = LayoutInflater.from(parent.context).inflate(R.layout.header,parent,false)
            MyHeaderHolder(view)
        }else {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item,false)
            MyHolder(view)
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder,position: Int) {
      if (getItemViewType(position) == viewTypeHeader){
            (holder as MyHeaderHolder).bind(list[position])
      }else{
          (holder as MyHolder).bind(list[position])
      }
    }

    override fun getItemViewType(position: Int): Int {
        return if (list[position].type == viewTypeHeader)
            return viewTypeHeader
        else
            viewTypeNormal

    }
    override fun getItemCount(): Int {
        return list.size
    }
}

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?