Я следовал этому руководству Google и реализовал динамический 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("item 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);
}