0

Android ListView Refresh Single Rowを参照しています

ただし、上記のリンク手法を使用するには、 にListView可視化する必要がありますArrayAdapter

現在、で表示を更新するための非常に最適化された方法を得るためにListView、私はこれを私のArrayAdapter

public PortfolioArrayAdapter(ListView listView, Activity activity, List<TransactionSummary> transactionSummaries) {
    super(activity, R.layout.portfolio_management_row_layout, transactionSummaries);
    this.activity = activity;
    this.listView = listView;
    ...
}

// Do not use notifyDataSetChanged, as it will refresh entire ListView.
// We only want to update certain row.
private void refreshView(final int row) {
    final int firstVisiblePosition = listView.getFirstVisiblePosition();
    final int lastVisiblePosition = listView.getLastVisiblePosition();
    if (row < firstVisiblePosition || row > lastVisiblePosition) {
        return;
    }
    this.activity.runOnUiThread(new Runnable() {
        public void run() {
            final View view = listView.getChildAt(row - firstVisiblePosition);
            // Refresh?
            getView(row, view, listView);                
        }
    });
}

しかし、私はそれらが互いに独立しているべきだと思っていたので、ListView参照を渡すのは不快に感じますか? ArrayAdapter(MVCのせい?)

ListView Refresh Single Rowを許可するより良い方法はありますか?

Java Swing では、かなりきちんとした方法でそれを行いました。これらは、テーブル モデルに次のメソッドを提供します。

fireTableCellUpdated(行、列);

したがって、そのモデルは、ビューが誰であるかを知らなくても、どの行と列が影響を受けているかをビューに伝えることができます。

Andorid では、私のモデル ( ArrayAdapter) がビューであることを知る必要があります。そうして初めて、私のモデルListViewはビューと対話できます。

4

1 に答える 1

1

ArrayAdapter が ListView への参照を持つことができないと思う理由がわかりません。ListView はビューであり、ArrayAdapter はモデルであるため、相互作用する必要があります。ウィキペディアから:

モデルは、状態が変化したときに、関連付けられているビューとコントローラーに通知します。この通知により、ビューは更新された出力を生成し、コントローラーは使用可能なコマンド セットを変更できます。

これがまさにリスナーの原理ではないでしょうか。リスニング オブジェクトのリストにビューを追加し、変更があればそれらに通知します。

于 2012-07-28T17:47:59.737 に答える