0

複合リスト ビューのモデル値を計算するRunnableクラスがあります。そのランナブルには、カスタム スレッド内に UI スレッドがあります。そこにアダプターのnotifyDataSetChanged()呼び出しがありnotifyDataSetChanged()ますが、メインレイアウトの TextView 値を更新しようとした後です。問題は、実行中の TextView が最初に更新され、次に ListViews が更新されて更新される場合です。カスタムクラスが最後に更新されるということnotifyDataSetChanged()は、Adapter私には適していません。これらの画面の更新を同期する可能性はありますか?

サンプルコードは次のとおりです。

public class TestRunnable implements Runnable {
    private TestAdapter adapter;

    @Override
    public void run() {
        Context.runOnUiThread(new Runnable() {
            @Override
            public void run() {

                adapter.notifyDataSetChanged();

                MainActivity.setTextViewValue("Something...");
            }
        });
    }
}

public class TestAdapter extends ArrayAdapter<TestModel> {
    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        View row = view;
        TestHolder holder;
        Boolean rowIsNew = false;
        if (row == null) {
            rowIsNew = true;
            LayoutInflater layoutInflater = ((Activity) context)
                    .getLayoutInflater();
            row = layoutInflater.inflate(layoutResourceId, parent, false);

            holder = new TestHolder();
            ...
            row.setTag(holder);
        } else {
            holder = (TestHolder) row.getTag();
        }

        TestModel testModel = data.get(position);
        holder.property = testModel.property;
        ...

        if (rowIsNew) {
            holder.....setTypeface(...);
            holder.....setTypeface(...);

        }

        return row;
    }
}
4

2 に答える 2

0

あなたのMainActivity.setTextViewValue("Something...");回線はアダプターからいくつかのデータを出力しようとしていて、古い値を取得していると思います。そうですか?

私はこれを100%確信していません.おそらく他の誰かがこれを確認するのを手伝うことができますがnotifyDataSetChanged()、アダプターの現在のデータをダーティとしてマークするだけだと思う​​ので、アダプターはデータを更新する必要があることを認識しますが、更新しませんあなたが電話をするときにすぐにそれをしてください。

編集:私の最初の段落が正しい場合は、テキストビューをアダプターの代わりにデータソースからのデータで更新してみてください。これは問題を解決するためのより良い方法です。

于 2014-03-22T22:14:00.837 に答える