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 に答える