gpt4 book ai didi

用于 Honeycomb 和 ICS 的 Android ListView 拖放 "Error: Reporting drop result: false"

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:35 24 4
gpt4 key购买 nike

我一直在尝试创建一个可以使用拖放进行排序的 ListView。

我已尝试遵循 Android 指南 here以及 Git 上提供的一些源代码 here .另外,我不想使用 Music 应用程序示例,因为我正在尝试使用 Honeycomb 及更高版本中提供的新工具。

到目前为止,我已经成功创建了列表,并且可以拖动项目。不幸的是,当我将项目放到列表中时,出现以下错误:

“I/ViewRoot(22739):报告放置结果:false”。

我怀疑我的 drop 监听器没有在正确的项目上创建,因此 drop 永远不会被调用。这是一些源代码,非常感谢您的帮助。

列表的 XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dropTarget"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@android:id/list" >
</ListView>
</LinearLayout>

我的 ListView :我还没有能够进入“ACTION_DROP”事件,所以代码没有经过测试。只是我正在做的事情。我的主要问题是我从未进入 ACTION_DROP。

public class procedureListView extends ListActivity {
private ListView mListView = null;
private ArrayAdapter<String> mArrayAdapter = null;
private View layoutDropArea = null;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list);

String[] countries = getResources().getStringArray(R.array.arrayOfStuff);
mArrayAdapter = new ArrayAdapter<String>(this, R.layout.list_item, countries);
setListAdapter(mArrayAdapter);

mListView = getListView();
mListView.setTextFilterEnabled(true);

layoutDropArea = findViewById(R.id.dropTarget);

setupDragDrop();
}
/**
* Setup what to do when we drag list items
*/
public void setupDragDrop(){
mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick(AdapterView<?> arg0, View v, int position, long arg3){
String value = (String) ((TextView) v).getText();
ClipData data = ClipData.newPlainText("procedure", value);
v.startDrag(data, new mDragShadowBuilder(v), null, 0);
return true;
}
});
myDragListener mDragListener = new myDragListener();
//mListView.setOnDragListener(mDragListener);

layoutDropArea.setOnDragListener(mDragListener);



}
protected class myDragListener implements OnDragListener{

public boolean onDrag(View v, DragEvent event) {
final int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
v.setBackgroundColor(Color.GRAY);
break;
case DragEvent.ACTION_DRAG_EXITED:
v.setBackgroundColor(Color.TRANSPARENT);
break;
case DragEvent.ACTION_DRAG_STARTED:
break;
case DragEvent.ACTION_DRAG_LOCATION:
v.setVisibility(View.VISIBLE);
// return processDragStarted(event);
case DragEvent.ACTION_DROP:
v.setBackgroundColor(Color.TRANSPARENT);
int newPosition = mListView.getPositionForView(v);
if (newPosition != ListView.INVALID_POSITION)
return processDrop(event, newPosition);
else
return false;
}
return false;
}

}

private boolean processDrop(DragEvent event, int newPosition) {
ClipData data = event.getClipData();
if (data != null) {
if (data.getItemCount() > 0) {
Item item = data.getItemAt(0);
String value = item.toString();
updateViewsAfterDropComplete(value, newPosition);
return true;
}
}
return false;
}
private void updateViewsAfterDropComplete(String listItem, int index) {
Log.d("InsertItem", "Position: "+ index);
mArrayAdapter.insert(listItem, index);
mArrayAdapter.notifyDataSetChanged();
}
private boolean processDragStarted(DragEvent event) {
ClipDescription clipDesc = event.getClipDescription();
if (clipDesc != null) {
return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN);
}
return false;
}
}

非常感谢您的帮助!

更新:

我不太明白为什么。但是当我将 switch case 更改为此时,它似乎起作用了:

switch (action) {
case DragEvent.ACTION_DRAG_ENTERED:
//v.setBackgroundColor(Color.GRAY);
return false;

case DragEvent.ACTION_DRAG_EXITED:
//v.setBackgroundColor(Color.TRANSPARENT);
return true;

case DragEvent.ACTION_DRAG_STARTED:
return true;

case DragEvent.ACTION_DRAG_LOCATION:
//v.setVisibility(View.VISIBLE);
return false;
// return processDragStarted(event);
case DragEvent.ACTION_DROP:
v.setBackgroundColor(Color.TRANSPARENT);
int newPosition = mListView.pointToPosition((int)(event.getX()),(int) event.getY());
Log.d("Position", Integer.toString(newPosition));
if (newPosition != ListView.INVALID_POSITION)
return processDrop(event, newPosition);
else
return false;
default:
return true;

}

最佳答案

您的更新解决了这个问题,因为当您获得 DragEvent.ACTION_DRAG_STARTED 时,您必须从 onDrag 返回 true 才能继续接收拖动事件给那个听众。在您的更新中,您为这种情况返回 true,因此您继续接收拖动事件并且放置逻辑正常工作。

如果您不为 DragEvent.ACTION_DRAG_STARTED 情况返回 true,您的监听器将不会收到除 DragEvent.ACTION_DRAG_ENDED 之外的任何其他事件>.

关于用于 Honeycomb 和 ICS 的 Android ListView 拖放 "Error: Reporting drop result: false",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10728013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com