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);