0

ここでは Android と Java の初心者ですが、私は長年にわたってさまざまな言語に手を出してきました。これは私を一週間ずっと狂わせてきました。

私の最初のアプリを作成しようとしています。これは、CheckedTextView アイテム (android.R.layout.simple_list_item_multiple_choice によって提供される) で構成される ListView を備えた決まり文句のショッピング リスト アプリです。ListView は CHOICE_MODE_MULTIPLE に設定されています。

ListView のバックエンドは、shoppingItems と呼ばれる ArrayList であり、ShoppingListItem は単純に次のように定義されます。

public class ShoppingListItem {

    public String name;
    public Boolean checked;

    // The obvious constructors here...

}

そして、オーバーライドされた getView() メソッドを持つ ArrayAdapter があります。

shoppingListAdapter = new ArrayAdapter<ShoppingListItem>
                        (this,
                        android.R.layout.simple_list_item_multiple_choice,
                        android.R.id.text1,
                        shoppingItems)
{
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        CheckedTextView rowView = (CheckedTextView)convertView;

        if (rowView==null){
            LayoutInflater inflater = getLayoutInflater();
            rowView = (CheckedTextView)inflater.inflate(android.R.layout.simple_list_item_multiple_choice, parent, false);
        }               
        rowView.setText(shoppingItems.get(position).name);
        rowView.setChecked(shoppingItems.get(position).checked);
        return rowView;
    }
};

アイテムの追加、アイテムの編集、コンテキスト メニューからの個々のアイテムの削除など、すべて正常に機能します。ただし、画面下部の [削除] ボタンを使用して、チェックされているすべてのアイテムを削除します。

removeCheckedItems メソッドを、以下のさまざまな組み合わせを含め、さまざまな方法で記述しようとしたに違いありません。

  • リストアダプターを使用してチェックされたアイテムを削除します(これは、私が読んだすべてのものから、動作するはずの方法です)
  • チェックされた項目を ArrayList から直接削除してから、notifyDatasetChanged() を呼び出します。
  • ListView から子ビューを明示的に削除する
  • リスト全体ではなく、ListView の getCheckedItemPositions() の結果を繰り返します。

これが私の最も素朴な試みです:

private void removeCheckedItems(){

    ShoppingListItem item;
    for (int i=0; i< adapter.getCount(); i++) {
        item = shoppingListAdapter.getItem(i);
        if (shoppingListView.isItemChecked(i)){
            item = shoppingItems.get(i);
            shoppingListAdapter.remove(item);
        }
    }
    removeBtn.setEnabled(false);
}

ただし、私はそれを行います。ListView のチェックボックスは、ShoppingItems ArrayList のデータと同期していません。具体的には、次のように始めます。

Item one   [ ]
Item two   [ ]
Item three [ ]

リストで、項目 1 にチェックを入れます。

Item one   [x]
Item two   [ ]
Item three [ ]

[削除] ボタンをクリックすると、ポップアップ ダイアログでアクションが確認されます。最初の項目は消えますが、最初の行のチェックボックスはオンのままです。

Item two   [x]
Item three [ ]

この時点で、デバッグ メッセージなどによって、ArrayList の内容が正しいことがわかります。つまり、正しい名前の 2 つの ShoppingListItem アイテムが含まれており、その両方の「checked」フィールドが false に設定されていることがわかります。

明らかな何かが欠けていると確信していますが、ここで多数の例を読んだり、ListView関連の回答をさらに読んだりしたにもかかわらず、私の人生ではそれを見ることができません。(詳細を確認する必要がある場合は、現在のアクティビティの完全なコード リストをここで確認できます。)

4

2 に答える 2

3

removeCheckedItems メソッドからもう一度 fillData() メソッドを呼び出すだけです。

データを変更するたびに、リストのデータを再度「入力」し、リスト アダプターを更新する必要があります。

「ListActivity fillData」チュートリアルを Google 検索すると、多くの優れた例が得られます。

ここにいくつかの良いものがあります:

行き詰まった場合はお知らせください。明日にはさらにサポートいたします。私はこれをたくさんやったので、あなたがそれからねじれを取り除くのを手伝うことができます.

于 2011-11-16T01:14:20.410 に答える
0

記録のために、これを最終的に機能させる唯一の方法は、独自のカスタム行レイアウトをgetView()使用し、android.R.layout.simple_list_item_multiple_choice. ArrayAdapter を介してデータを変更するたびに ListView が即座に正しく更新され、データをnotifyDatasetChanged()直接変更するときにも同様に行われるなど、すべてが期待どおりに機能しました。

于 2012-03-12T01:46:10.997 に答える