如何使从回收器视图中拖动的项目出现在目标上方而不是消失在其下方?

问题描述 投票:0回答:1

我有一个回收视图和一个图像视图。我希望能够将列表中的项目拖到图像视图的顶部(然后将其放下)。 问题是,当我拖动项目时,它会进入图像下方而不是上方。

活动部分

private void updateRecycler(RecyclerView myrecyclerview)
    {
        RecyclerView r = myrecyclerview;

        itemsAdapter=new skutest_recyclerview_viewadapter(itmlist);

        runOnUiThread(() -> {
            if (r.getLayoutManager()==null)
            {
                r.setLayoutManager(new LinearLayoutManager(MainActivity.this));
            }
            r.setAdapter(itemsAdapter);

            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(itemsAdapter));
            itemTouchHelper.attachToRecyclerView(r);

        });
    }

public interface ItemTouchHelperAdapter {

    void onItemMoved(int fromPosition, int toPosition);

    void onItemDropped(int position); // Optional for handling dropped items on image
}
public class skutest_recyclerview_viewadapter extends RecyclerView.Adapter<skutest_recyclerview_viewadapter.ViewHolder> implements ItemTouchHelperAdapter
{
    RecyclerView mRecyclerView;
    List<cl_sku_info> skulist;

    public skutest_recyclerview_viewadapter(List<cl_sku_info> skulist)
    {
        this.skulist=skulist;

    }

    @NonNull
    @Override
    public skutest_recyclerview_viewadapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
    {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        ItemBinding b = ItemBinding.inflate(inflater, parent, false);
        return new ViewHolder(b);
    }

    @Override
    public void onBindViewHolder(@NonNull skutest_recyclerview_viewadapter.ViewHolder holder, int position)
    {
        holder.setData(skulist.get(position));

    }

    @Override
    public int getItemCount()
    {
        return skulist==null ? 0 : skulist.size();
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView)
    {
        super.onAttachedToRecyclerView(recyclerView);
        mRecyclerView = recyclerView;
    }

    @Override
    public void onItemMoved(int fromPosition, int toPosition)
    {

    }

    @Override
    public void onItemDropped(int position)
    {

    }


    public static class ViewHolder extends RecyclerView.ViewHolder
    {
        private final ItemBinding binding;
        public ViewHolder(ItemBinding binding)
        {
            super(binding.getRoot());
            this.binding=binding;
        }

        public void setData(cl_sku_info clSkuInfo)
        {
            binding.label.setText("*****");//clSkuInfo.getSTOCK_NO());
            binding.image.setImageBitmap(images.getInstance().getimage(clSkuInfo.getSTOCK_NO(),100));
        }

    }


}

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback
{
    private final ItemTouchHelperAdapter adapter;

    public ItemTouchHelperCallback(ItemTouchHelperAdapter adapter)
    {
        this.adapter = adapter;
    }


    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder)
    {
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT;
        final int swipeFlags = 0; // Disable swiping for now
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target)
    {
        adapter.onItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

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

    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:weightSum="2"
    android:hardwareAccelerated="false"
    tools:context=".activities.MainActivity">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/myrecyclerview"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        tools:itemCount="20"
        android:layout_weight="1"
        tools:listitem="@layout/item" />


    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"

        android:background="@drawable/i1"
        android:scaleType="center" />
</LinearLayout>

正如您在图像中看到的那样,拖动的项目在目标图像下方丢失了。 我认为默认行为是漂浮在所有东西之上,我看不出我哪里出了问题。

java android android-recyclerview drag-and-drop z-order
1个回答
0
投票

事实证明我采取了错误的方法。

通过丢弃该问题即可解决

ItemTouchHelperCallback 和 ItemTouchHelperAdapter

摆脱

            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(itemsAdapter));
            itemTouchHelper.attachToRecyclerView(r);

改变

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public void onBindViewHolder(@NonNull skutest_recyclerview_viewadapter.ViewHolder holder, int position)
    {
        holder.setData(skulist.get(position));

        holder.getBinding().getRoot().setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                return tevent(v,event);
            }
        });
        //holder.getBinding().getRoot().setOnDragListener(new DragListener());
    }

并在下面添加(学分https://github.com/jkozh/DragDropTwoRecyclerViews

public boolean tevent(View v,MotionEvent event)
    {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                v.startDragAndDrop(data, shadowBuilder, v, 0);
                v.performClick();
                return true;
        }
        return false;
    }

要达成这一理解,经历了很多泥潭。 recyclerview 的默认拖放功能似乎适用于使用相同 recyclerview 的操作,例如重新排序。当您希望拖动逃离回收器视图并漂浮在所有东西上时,您必须执行以下操作。

© www.soinside.com 2019 - 2024. All rights reserved.