-1

これが私の主な活動です:

adapter.setNotifyOnChange(true);
lv = (ListView) findViewById(R.id.listView1);
lv.setAdapter(adapter);

public void onClick(View view) {
        adapter.add(text);          
        new DoSomethingWithListViewChild(lv, index).execute();
    }

これは AsyncTask DoSomethingWithListViewChild です。

public class DoSomethingWithListViewChild extends AsyncTask<Void, Void, Void> {
    TextView tv;

    public DoSomethingWithListViewChild (ListView lv, int index) {
        View v = lv.getChildAt(index - lv.getFirstVisiblePosition());
        tv = (TextView) v.findViewById(R.id.textTitle);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Do something with TV
        return null;
    }

問題は、コードが実行されているlvときにまだ空であることです。View v = lv.getChildAt(index - lv.getFirstVisiblePosition());

ロック オブジェクトとの同期を試みましたが、デッドロックまたはその他のエラーで終了しています。

lv空でなくなるまで待つにはどうすればよいですか?

編集:

わかりました、私はこれを試しました:

    ...
    ConditionVariable lock = new ConditionVariable(false);
    ...
    public void onClick(View view) {
                adapter.add(text);
                lock.block();
                new DoSomethingWithListViewChild(lv, index).execute();
            }

そして私のカスタムアダプターでは:

public class MyAdapter extends ArrayAdapter<SpannableString> {
    ConditionVariable lock;

    public MyAdapter(Context context, int layout_resource_id, ConditionVariable lock) {
        ...
        this.lock = lock;
        ...
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...
        lock.open();
        return convertView;
    }
}

しかし、プログラムはただハングします。lvロックを開くために が読み込まれる正確な瞬間を見つける必要があります。それは明らかにgetView方法ではありません..lock.open();

4

1 に答える 1

0

adapter.notifyDayaSetChanged()後で電話する必要があるかもしれませんadapter.add(text)

于 2013-08-01T12:26:23.337 に答える