我有一个回收视图和一个图像视图。我希望能够将列表中的项目拖到图像视图的顶部(然后将其放下)。 问题是,当我拖动项目时,它会进入图像下方而不是上方。
活动部分
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>
正如您在图像中看到的那样,拖动的项目在目标图像下方丢失了。 我认为默认行为是漂浮在所有东西之上,我看不出我哪里出了问题。
事实证明我采取了错误的方法。
通过丢弃该问题即可解决
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 的操作,例如重新排序。当您希望拖动逃离回收器视图并漂浮在所有东西上时,您必须执行以下操作。