【发布时间】:2015-07-09 03:48:04
【问题描述】:
我遵循这个谷歌教程并实现了一个动态的 ListView 拖放 https://www.youtube.com/watch?v=_BZIvjMgH-Q
listView = (DynamicListView) findViewById(R.id.listview);
adapter = new StableArrayAdapter(this, R.layout.text_view, arraylist);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
// added the items later and called notifyDataSetChanged();
arraylist.add("item 1");
arraylist.add("item 2");
arraylist.add("item 3");
arraylist.add("item 4");
adapter.notifyDataSetChanged();
它显示了列表视图中的所有项目,但是当我拖放元素时它们消失了。
如果我在设置适配器 listView.setAdapter(adapter); 之前添加元素,它完全可以正常工作。
库源码http://developer.android.com/shareables/devbytes/ListViewDraggingAnimation.zip
我该如何解决这个问题?
更新
StableArrayAdapter.java
package com.example.android.navigationdrawerexample;
import android.content.Context;
import android.widget.ArrayAdapter;
import java.util.HashMap;
import java.util.List;
public class StableArrayAdapter extends ArrayAdapter<String> {
final int INVALID_ID = -1;
int mRowLayout;
List<String[]> mStrings;
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
// constructor
public StableArrayAdapter(Context context, int rowLayout, List<String> objects) {
super(context, rowLayout, objects);
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}
@Override
public long getItemId(int position) {
if (position < 0 || position >= mIdMap.size()) {
return INVALID_ID;
}
String item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
更新 2 我按照建议在此处将项目添加到 objects 中,现在它工作正常,但它与在设置适配器之前在 MainActivity 中添加项目不同吗?
public StableArrayAdapter(Context context, int rowLayout, List<String> objects) {
super(context, rowLayout, objects);
objects.add("item 1");
objects.add("item 2");
objects.add("item 3");
objects.add("item 4");
objects.add("item 5");
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}
更新 3 对象的大小仅在构造函数中知道 和 mIdMap.put("项目 6", objects.size());在代码中没有任何效果。
// constructor
public StableArrayAdapter(Context context, int rowLayout, List<String> objects) {
super(context, rowLayout, objects);
this.objects = objects;
objects.add("item 1");
objects.add("item 2");
objects.add("item 3");
objects.add("item 4");
objects.add("item 5");
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
mIdMap.put("item 6", objects.size()); // has no effect
}
public void addItem(String item) {
int index = objects.size();
mIdMap.put(item, index);
}
【问题讨论】:
-
请发布 StableArrayAdapter 的代码。并添加另一个“拖放”标签。在我看来,这篇文章不适用于“android-animation”。
-
这个问题你解决了吗?如果没有,您可以回复我发布的答案以了解您对此的状态。
-
Vinay,下次,在我的回答中发表您的评论,以便我注意到它。我在更新 2 中几乎忽略了您的问题。或者在您的帖子中添加您的问题,并作为对我发布的答案的评论。无论如何....
-
Vinay,答案是它与设置适配器后在 MainActivity 中添加项目不同。您的原始代码在设置适配器后添加了更多字符串。原因是对象 mIdMap 的内存地址与对象 arraylist 不同。这是Java中的重要知识,祝你好运。
-
Vinay,我在发布的答案的 UPDATE 部分下添加了 cmets/code。
标签: android android-listview drag-and-drop