在我的項目中,我有一個多列ListView活動。這個ListView從我在一個單獨的java模塊中實現的自定義CursorAdapter中繪製它的數據。我在ListView的行內有幾個視圖的監聽器,這些都在CursorAdapter中實現。其中一位聽衆需要編輯調用它的視圖內容並將數據保存回底層數據庫。此編輯需要startActivityForResult(作爲自定義對話框)。但是,我收到一個錯誤,因爲一個活動只能從另一個活動中調用。我已經嘗試將startActivityForResult移動到父活動中的某個過程,但是這會成爲要從偵聽器調用的靜態過程,並且由於startActivityForResult不能處於靜態過程中,所以出現錯誤。錯誤是 「對於類型new View.OnClickListener(){},未定義方法startActivityForResult(Intent,int)」android從多列列表視圖調用活動
有沒有人從視圖偵聽器調用活動的過程,其中視圖是行元素的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);
非常感謝,十字軍能解決問題。對於有同樣問題的其他人,請注意兩個getBaseContext()是無效的,我不得不使用RowViewHolder中的ctx上下文。我會在問題中發佈修改後的代碼。 – jrisch