私のプロジェクト内には、複数列の ListView を使用するアクティビティがあります。この ListView は、別の Java モジュールに実装したカスタム CursorAdapter からデータを取得します。ListView の行内のいくつかのビューにリスナーがあり、これらは CursorAdapter 内に実装されています。リスナーの 1 つは、それを呼び出したビュー コンテンツを編集し、データを基になるデータベースに保存し直す必要があります。この編集は、ActivityForResult (カスタム ダイアログとして) を開始する必要があります。ただし、アクティビティは別のアクティビティからのみ呼び出すことができるため、エラーが発生します。startActivityForResult を親アクティビティのプロシージャに移動しようとしましたが、これはリスナーから呼び出される静的プロシージャである必要があり、startActivityForResult を静的プロセスにすることはできないため、エラーが発生します。エラーは「
ビューがListViewの行要素であるビューリスナーからアクティビティを呼び出すプロセスはありますか?
以下のコードは、CursorAdapter で使用しているプロセスです。
public class CustomCursorAdapter extends CursorAdapter {
protected static class RowViewHolder {
public Button btnLap;
public TextView tvTime;
}
public CustomCursorAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View retView = inflater.inflate(R.layout.single_row_item, parent, false);
RowViewHolder holder = new RowViewHolder();
holder.btnLap = (Button) retView.findViewById(R.id.btn_lap);
holder.tvTime = (TextView) retView.findViewById(R.id.tv_time);
holder.btnLap.setOnClickListener(btnLapOnClickListener);
holder.tvTime.setOnClickListener(tvTimeOnClickListener);
retView.setTag(holder);
return retView;
}
...
private OnClickListener tvTimeOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v;
String strTime = tv.getText().toString();
Intent intentTimeEdit = new Intent(getBaseContext(), TimeEditDialog.class);
intentTimeEdit.putExtra("Time", strTime);
startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);
}
};
以下のコメントに従って、OnClickListener のコードは次のように修正されました。
TextView tv = (TextView) v;
String strTime = tv.getText().toString();
RowViewHolder holder = new RowViewHolder();
holder = (RowViewHolder) ((View) v.getParent()).getTag();
Intent intentTimeEdit = new Intent(holder.ctx, TimeEditDialog.class);
intentTimeEdit.putExtra("Time", strTime);
((Activity)holder.ctx).startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);