2011-08-18 47 views
0

即時答案是否,這在Java中是不可能的。我明白,這是一個noob問題,但我一直在編寫這種方式一段時間,我總是覺得這是一個骯髒的方法,所以我想澄清我在做什麼。說例如我有一個Activity擴展了Activity類,以便我可以使用onCreate等等......在該Activity中,我有一個SimpleCursorAdapter來填充ListView。Android在活動中覆蓋多個類

String sql = "SELECT * FROM myTable"; 
Cursor data = database.rawQuery(sql, null); 
String fields[] = {"field1", "field2", "field3"}; 
adapter = new CustomCursorAdapter(this, R.layout.custom_row, data, fields, new int[] { R.id.Field1, R.id.Field2, R.id.Field2 }); 
list.setAdapter(adapter); 

,因爲我創建一個名爲CustomCursorAdapter全新的類,它擴展SimpleCursorAdapter這樣我就可以使用諸如bindView,NewView的等上使用我的ListView控件對象按鈕我命名這個CustomCursorAdapter。

public class CustomCursorAdapter extends SimpleCursorAdapter { 

private Context myContext; 
private myActivity parentActivity; 
private Button delButton;  

public CustomCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    myContext = context; 
    parentActivity = (myActivity) myContext; 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    int idColumn = cursor.getColumnIndex("_id"); 
    final int getId = cursor.getInt(idColumn); 
    final double increment = 0.25; 

    UnitsConversions convert = new UnitsConversions(); 

    int nameColumn = cursor.getColumnIndex("name"); 
    String getName = cursor.getString(nameColumn); 
    TextView name = (TextView)view.findViewById(R.id.GrainName); 
    name.setText(getName); 

    delButton = (Button)view.findViewById(R.id.DeleteButton); 
    delButton.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View arg0) { 
      parentActivity.deleteItem(getId); 
     }   
    }); 


@Override 
public View newView(Context context, Cursor cursor, final ViewGroup parent) { 
    View view = View.inflate(context, R.layout.list_item, null); 
    return view; 
} 

我攀登我的代碼了很多在這裏,所以如果我刪除任何讓這種非工作的代碼我appologize只是作爲一個例子使用,但非工作代碼是不是我的問題的目的。我的問題是,除非使用SimpleCursorAdapter擴展活動本身,否則這是覆蓋方法的唯一方法嗎?它看起來不是什麼大問題,但是當我有10個不同的活動時,所有的基本上都做同樣的事情,但有不同的ListView和項目,我必須創建10個不同的CustomCursorAdapter,看起來很髒和多餘。也許有一種方法只創建1個其他活動,然後傳遞我需要的項目?看起來只要使用SimpleCursorAdapter而不是創建一個自定義的並且覆蓋Activity中我需要的方法就會更清晰。如果我沒有正確地提出這個問題,請隨時編輯。

回答

0

是的,有一個更好的方法。你可以創建一個Activity的子類(並且如果你願意,可以聲明它是抽象的),它實現了你在10個類中共享代碼的每個方法的重寫版本。然後,對於您需要的每個實際活動,請擴展該活動的子類,並僅對每種方法進行所需的更改。如果一個方法在每個類中都不相同,但是將其大部分代碼與其他活動共享,則可以調用general.method()方法,然後應用特定的更改。

+0

好吧,你要說創建一個名爲SubActivity(或其他)的新類並擴展Activity,然後在同一個SubActivity中聲明另一個類並擴展SimpleCursorAdapter以及其他任何我可能需要的東西。然後擴展該SubActivity,我將從多個類中提供所有我的方法,我可以根據自己的判斷來覆蓋它們?我可以舉個例子嗎? – ryandlf

+0

是的。對於一個非常簡單的例子,設想SubActivity聲明一個公共實例變量TextView,稱爲tv,並寫入onCreate方法來在該TextView上調用setContentView。然後在每個真正的Activity中,在onCreate中,你只需調用super.onCreate()然後說tv.setText(「Some String」);您不必在每個子類中聲明TextView並重復setContentView行,只需要更改Activity特定文本的行。 – Jems

+0

有道理,但是沒有辦法基本調用該子類中的多個類,然後在實際活動中擴展子類,以便我可以覆蓋所有在子類中聲明的類?對於每個不同的活動,我都有不同的變量,所以對我來說嘗試重用這部分代碼沒有多大意義。我寧願只能重寫我的活動中的方法,這樣我就可以保留所有需要和整齊的東西,而不必擁有Activity1,CustomAdapter1,Activity2,CustomAdapter2等。 – ryandlf