13

ListView を含む子アクティビティがあります。このアクティビティは、SQLite カーソルから非同期的に設定されます。リスト項目には、TextView、RadioButton、および通常の Button が含まれています。XML を以下に示します。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/rlCategoryListItemLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content">
 <TextView android:id="@+id/tvCategoryListItemTitle" style="@style/uwLargeListItemLabelStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:text="This is a test note title" />
 <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:gravity="center_vertical">
  <RadioButton android:id="@+id/rdoCategoryListItemSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dip" />
  <Button android:id="@+id/btnCategoryListItemDelete" android:background="@drawable/delete_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" />
 </LinearLayout>
</RelativeLayout>

デフォルトでどの RadioButton が選択されているかを判断するには、いくつかのロジックを実行する必要がありますが、ListView が既に読み込まれるまでそれを行うことはできません。問題は、これまでに試したすべてのイベント (onCreate、onPostCreate、onResume、onWindowFocusChanged) で、ListView の子カウントがゼロであることです。また、ArrayAdapter クラスで getView メソッドを使用しようとしましたが、そのメソッドは複数回呼び出され、ListView の子カウントが毎回異なる可能性があり、予期しない結果につながります。どうやら、これらのイベントは、ListView がその子項目を完全に取り込み完了する前に発生しています。

リッスンできるイベント、または ListView の作成が完了し、そのすべての子がプログラムで変更できるようになったことを判断する他の方法はありますか?

ありがとうございました!

4

4 に答える 4

6

次のように、ハンドラーを使用してこのタスクを実行できます。

アクティビティで、ハンドラーを他のプロパティとして追加します。

private Handler mListViewDidLoadHanlder = new Handler(new Handler.Callback() { 
    @Override
    public boolean handleMessage(Message message) {
        //Do whatever you need here the listview is loaded
        return false;
    }
});

リストビュー アダプターの getView メソッド内で比較を行い、現在の位置が最後の位置であるかどうかを確認します。終了します (リターンの前に置くだけです)。

public View getView(int position, View convertView, ViewGroup parent) {
         //Your views logic here

         if (position == mObjects.size() - 1) {
                mViewDidLoadHanlder.sendEmptyMessage(0);
            }

         return convertView;
     }
于 2014-10-05T12:46:28.397 に答える
2

データベースでの非同期作業の最後に、 を使用Handler.post(Runnable)してメイン スレッドでコードを実行できます。

これは、リストが作成された後に実行されることを保証できるコールバックをトリガーするようなものです。すべての時間を非常に慎重に計る必要がある場合は、Runnable が特定の時間に発生するようにスケジュールできます。

これがお役に立てば幸いです。

于 2010-10-28T04:19:52.827 に答える
1

ListView は、レンダリングしているデータのリスト内の各要素のビューを実際には作成しません。代わりに、応答性を高め、メモリを占有しないようにするために、ビューをリサイクルします。ListView に値を設定する必要があると言うとき、本当に必要なものを再考するかもしれません。

アプリについてもう少し詳しく説明し、コードを投稿すると役立つ場合があります。

于 2010-10-28T02:37:02.467 に答える
0

アクティビティに文字列変数を追加し (例: public static String END_LOAD)、getView メソッド (アダプター内) に値を設定してから、アクティビティ内に値を設定します。

ListView listView = (ListView) findViewById(R.id.recordListView);
        listView.setAdapter(adapter);

END_LOAD 変数をチェックする単純なスレッドを追加できます。

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        while (END_LOAD == null || END_LOAD .equals("") ) { // your conditions
        }
        createReadRequest(); // your task to execute
    }
};

new Thread(runnable).start();

興味深い単純な条件を追加します。条件が false になるのは、getView メソッドが完了したためです。これで、特定のプロセスを実行できます。

于 2014-02-14T21:20:26.683 に答える