Android 用户拖动时滚动ListView&;删除一个项目

Android 用户拖动时滚动ListView&;删除一个项目,android,android-listview,scroll,drag-and-drop,Android,Android Listview,Scroll,Drag And Drop,我有一个列表视图mRecipeListView,其中包含许多项 在listViewAdapter中,当它为要显示的项目生成视图时,我添加了一个onLongClickListener,它启动了一个拖动操作: view.setOnLongClickListener(new View.OnLongClickListener() { ClipData data = ClipData.newPlainText("", ""); View.DragShadowBuilder shadowBuilde

我有一个列表视图
mRecipeListView
,其中包含许多项

listViewAdapter
中,当它为要显示的项目生成视图时,我添加了一个
onLongClickListener
,它启动了一个拖动操作:

view.setOnLongClickListener(new View.OnLongClickListener() {
  ClipData data = ClipData.newPlainText("", "");
  View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
  view.startDrag(data, shadowBuilder, view, 0);
  // Highlight dragged view.
  view.setBackgroundColor(getResources().getColor(R.color.app_color_accent));
  view.invalidate();
}
同一视图还获得一个
ondraglister
,这样每个视图都是一个有效的放置目标。当然,目标是通过拖放实现视图的重新排序:

view.setOnDragListener(new View.OnDragListener() {
  @Override
  public boolean onDrag(View view, DragEvent dragEvent) {
  switch (dragEvent.getAction()) {
    // ...
    // re-ordering works just fine
    // ...
    case DragEvent.ACTION_DRAG_LOCATION:                                   
      // y-coord of touch event inside the touched view (so between 0 and view.getBottom())
      float y = dragEvent.getY();
      // y-coord of top border of the view inside the current viewport.
      int viewTop = view.getTop();
      // y-coord that is still visible of the list view.
      int listBottom = mRecipeListView.getBottom(),
      listTop = mRecipeListView.getTop();

      // actual touch position on screen > bottom with 200px margin
      if (y + viewTop > listBottom - 200) {
        mRecipeListView.smoothScrollBy(100, 25);
        View child = mRecipeListView.getChildAt(mRecipeListView.getChildCount() - 1);
        child.setVisibility(View.GONE);
        child.setVisibility(View.VISIBLE);
      } else if (y + viewTop < listTop + 200) {
        mRecipeListView.smoothScrollBy(-100, 25);
        View child = mRecipeListView.getChildAt(0);  
        child.setVisibility(View.GONE);
        child.setVisibility(View.VISIBLE);
      }
      return true;
  }
}
用于向下滚动。这意味着获取了
列表视图的最后一个子项
,它的可见性变为
消失了
,并返回,这迫使它注册为有效的放置目标。模拟向上滚动,但在索引
0
处获取子级,而不是最后一个

另一个问题出现了,我还没有找到解决办法:

1) 我通过更改其背景颜色来突出显示用户正在拖动的项目。当用户现在向下滚动时,该项目的视图将被丢弃。当用户向后滚动时,视图被循环使用,但它现在是一个与以前不同的视图。背景更改回默认值,保留对视图的引用也不起作用,因为相等性检查将失败,因为回收的视图与原始视图不同。因此,我不知道如何更改此项目视图的背景

2) 滚动绑定到当用户在有效放置目标的边界框内拖动时触发的事件。这迫使我保持用户正在拖动的视图可见,因为我需要该视图的边界框在它是(例如)顶部可见视图时启动滚动事件。我宁愿将其变为不可见,但为此,我必须在拖动事件约束之外进行滚动

3) 出于同样的原因:当用户将手指保持在列表的底部,并且有空间滚动时,只有手指继续移动,它才会继续滚动,否则不会触发新事件


我试图对触摸事件作出反应,但似乎在拖动操作过程中没有处理这些事件。

这是一个非常好的阅读和理解。您是否从教程或项目中获得代码?您想要我为ListView拖放找到的好样本吗?
View child = mRecipeListView.getChildAt(mRecipeListView.getChildCount() - 1);
child.setVisibility(View.GONE);
child.setVisibility(View.VISIBLE);