0

在我的項目中,我有一個多列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); 

回答

0

The method startActivityForResult(Intent, int) is undefined for the type new View.OnClickListener(){}它變得清晰,startActivityForResult或startActivity如果類擴展Acitvity只能叫。它贏得了「噸甚至接受內部類裏面...

嘗試

((Activity)getBaseContext()).startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);和檢查結果。

+0

非常感謝,十字軍能解決問題。對於有同樣問題的其他人,請注意兩個getBaseContext()是無效的,我不得不使用RowViewHolder中的ctx上下文。我會在問題中發佈修改後的代碼。 – jrisch

0

嘗試通過上下文在適配器類的構造函數,然後代替

startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE); 

ctx.startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE); 
+0

嗨以色列,我試過你的解決方案,但得到了一個編譯錯誤「方法startActivityForResult(意圖,INT)是未定義的類型上下文」。根據CRUSADER的解決方案,它看起來需要投入到活動中。 – jrisch

+0

哦,對不起,您還需要將ctx轉換爲Activity才能使用startActivityForResult方法,因爲它是Activity類的一個方法。 應該是: public CustomAdapter(Context context)implements BaseAdapter this.ctx = context; } getView方法 ((Activity)ctx).startActivityForResult(..) –