0

我是Android开发的新手,我研究了这个网站的帖子并尝试了许多不同的建议,但仍然无法解决问题。

这里参考实现拖放列表视图(即用户可以长按并拖动列表项以重新排列位置。我创建了一个自定义ListView,一个Adapter和一个ListActivity。这是ListActivity的部分代码:

public class DragNDropListActivity extends ListActivity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.dragndroplistview);

    ArrayList<String> content = new ArrayList<String>(mListContent.length);
    for (int i=0; i < mListContent.length; i++) {
        content.add(mListContent[i]);
    }

    setListAdapter(new DragNDropAdapter(this, new int[]{R.layout.dragitem}, new int[]{R.id.TextView01}, content));//new DragNDropAdapter(this,content)
    ListView listView = getListView();

    if (listView instanceof DragNDropListView) {
        ((DragNDropListView) listView).setDropListener(mDropListener);
        ((DragNDropListView) listView).setRemoveListener(mRemoveListener);
        ((DragNDropListView) listView).setDragListener(mDragListener);
    }

    listView.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.i("", "OnItemClick");
        }
    });

}

private DropListener mDropListener = 
    new DropListener() {
    public void onDrop(int from, int to) {
        ListAdapter adapter = getListAdapter();
        if (adapter instanceof DragNDropAdapter) {
            ((DragNDropAdapter)adapter).onDrop(from, to);
            getListView().invalidateViews();
        }
    }
};

我的问题是:当我将一个项目拖放到一个新位置时,它被正确替换了。但在那之后,当我再次尝试拖动该项目时,会显示该位置的前一个项目。如果我将应用程序置于后台然后再将其放回,则可以恢复此问题。

在“onDrop”中,列表视图无效。我从这个站点了解到 invalidateViews() 不会立即运行,但似乎 invalidateViews() 在我将应用程序放入后台之前永远不会运行?!如何强制列表视图重绘自身?

更多信息:该应用程序在模拟器中正常运行,但这个问题发生在我的 Galaxy 手机(4.1.2)中。

希望有人能帮忙,非常感谢!

4

1 回答 1

0

检查它是否有效:

private DropListener mDropListener = 
new DropListener() {
public void onDrop(int from, int to) {
    ListAdapter adapter = getListAdapter();
    if (adapter instanceof DragNDropAdapter) {
       ((DragNDropAdapter)adapter).notifyDataSetChanged();
        ((DragNDropAdapter)adapter).onDrop(from, to);
         getListView().invalidate();

    }
}

};

于 2013-09-04T14:56:30.363 回答