1

ListView にたくさんのアイテムがあります。各アイテムには、いくつかの編集可能なビューが含まれています。ユーザーがこれらに加えた変更を保存したい。保存が発生するイベントは、アイテムがフォーカスを失ったときです。

私は現在2つの方法を見ています:

    View.OnFocusChangeListener() with  onFocusChange(View v, boolean hasFocus)

これは機能しますが、各アイテムにはいくつかの編集可能なビューが含まれているため、面倒です。アイテム全体がぼやけている場合は、むしろ保存したいと思います。これまでの単純化の試みには、複雑なものしかありませんでした。

OnItemDeSelectedListener があれば完璧ですが、反対しかありません。

    AdapterView.OnItemSelectedListener() with onItemSelected(AdapterView<?> adapterView, View view, int i, long l)

表面上はこれでよさそうです。変数 lastSelectedView を作成するだけなので、最後に選択された (選択解除された) アイテムが何であるかがわかります。問題は、ListView がビューをリサイクルする方法です。アダプターが lastSelectedView をリサイクルせず、含まれるデータを変更したという保証はないと思います。これは合理的な仮定ですか?

OnItemSelectedListener でリサイクル ビューの問題を回避する合理的な方法はありますか?

4

2 に答える 2

0

私の答えは、ここでの他の答えと似ていますが、リサイクルの問題に少し違った方法で対処しようとしています. . 現在のビュー (パラメータとして onItemSelected に送信) からのデータを最終的な変数またはフィールドに保存して、onItemSelected の次の呼び出しで使用します。

たとえば、モデル オブジェクトは次のとおりです。 public class YourModelObject{ public YourModelObject(String dataString, int dataInt){ this.dataString = dataString; this.dataInt = dataInt; } プライベート文字列 dataString; プライベート int dataInt; // ここに getter、setter、およびメソッドがいくつかあります... }

それを表示するリストビューは次のとおりです。

ListView myListView;

ArrayList<YourModelObject> listOfModelObjects;
//somewhere before onItemSelected listOfModelObjects is initialized with data

final YourModelObject lastItemData; //this can either be final, or an instance variable.

myListView.setOnItemSelectedListener(new OnItemSelectedListener(){

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int i, long l)
    {
        //use last saved data:
        if (lastItemData != null){
            //do some stuff with lastItemData
        }
        //save current data for next call:
        TextView tv = (TextView) view.findViewById(someId);
        NumberPicker np = (NumberPicker) view.findViewById(anotherId);
        String dataString = tv.getText().toString();
        int dataInt = np.getValue();
        lastItemData = new YourModelObject(dataString , dataInt);
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

この方法では、アイテムがフォーカスを失った後 (および新しいアイテムが選択された後) にのみデータを操作し、リサイクルされているビューを実際に保持するのではなく、含まれていたデータのみを保持するため、データの一貫性について肯定的です。お役に立てば幸いです:)

于 2013-10-08T13:58:35.483 に答える