これが私の主な活動です:
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();