2015-02-12 74 views
0

我在.net中完成了大量的強制類型轉換 - 主要是從泛型對象向更具體的對象轉換,我知道會工作。但是我從來沒有投到我自己的類中,直到現在我在Android中已經放置了一些來自示例的代碼。如何從getAdapter到我的泛型類型的工作

我似乎無法找到很好的例子,顯示與正在被投與來自類的代碼伴隨的代碼。基本上,我試圖準確理解在這種情況下鑄造是如何工作的,因爲我想修改下面稱爲dbData的類以包含其他變量和方法,但我不確定它將如何影響下面的onClick方法中的投射。 onClick方法位於包含listView和一對按鈕的Activity中。這些按鈕可以添加一個listView項目或刪除第一個listView項目。當刪除該項目時,它發送這個拋出的問題dbData =(dbData)lstView.getAdapter()。getItem(0);

dbData是從我的例子中派生出來的類。我無法理解的部分是,演員似乎成功地使用演員填充變量id和dbData。

  1. 它是如何知道這麼做的?基本問題,但似乎無法找到詳細的說明。如果dbData只是一個字符串,getItem(0)只返回一個字符串,這看起來很明顯。但在這種情況下,它填充字符串「dbData」和整數「id」我可以從演員陣列填充其他變量或對象嗎?這個問題的目的是理論上的;意思是說,如果我可以抓住其他變量,我怎麼知道我可以抓住哪些變量,並且是否有任何特殊的技術來定義dbData中的變量?

  2. 我可以將其他變量和類添加到dbData類而不會搞亂轉換,或讓這些變量無意中在轉換中填充?我將如何肯定要這樣做?

有希望的是,我只是試圖瞭解演員的作品是如何在我的問題中出現的。感謝您的任何幫助!

下面是與上述投活動代碼:

public void onClick(View view) { 
    @SuppressWarnings("unchecked") 

    ListView lstView = (ListView)findViewById(R.id.lstHolidays); 

    ArrayAdapter<dbData> adapter = (ArrayAdapter<dbData>) lstView.getAdapter(); 
    dbData dbData = null; 
    switch (view.getId()) { 
     case R.id.add: 
      String[] comments = new String[] { "Cool", "Very nice", "Hate it" }; 
      int nextInt = new Random().nextInt(3); 
      // save the new dbData to the database 
      dbData = datasource.createDB_Row(comments[nextInt]); 
      adapter.add(dbData); 
      break; 
     case R.id.delete: 
      if (lstView.getAdapter().getCount() > 0) { 
       dbData = (dbData) lstView.getAdapter().getItem(0); 
       datasource.deleteDB_Row(dbData); 
       adapter.remove(dbData); 
      } 
      break; 
    } 
    adapter.notifyDataSetChanged(); 
} 

這裏的dbData類:

public class dbData { 

    private long id; 
    private String dbData; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getDbData() { 
     return dbData; 
    } 

    public void setDbData(String dbData) { 
     this.dbData = dbData; 
    } 

    // Will be used by the ArrayAdapter in the ListView 
    @Override 
    public String toString() { 
     return dbData; 
    } 

} 

回答

1

有兩個在代碼中轉換。

您使用的是通用的ArrayAdapter cointaining dbData對象:

ArrayAdapter<dbData> adapter = (ArrayAdapter<dbData>) lstView.getAdapter(); 

在你的代碼也許某個地方要設置它,所以每當它是一個ArrayAdapter(或派生類),上述鑄造會工作。

關於dbData ...您不是將適配器轉換爲dbData。你得到你的適配器(ArrayAdapter),檢索項目,並將其強制轉換爲dbData:

dbData = (dbData) lstView.getAdapter().getItem(0); 

所以,你ArrayAdapter包含dbData對象,鑄造也將正常工作。

這段代碼是等價的:

dbData = ((ArrayAdapter<dbData>) lstView.getAdapter()).getItem(0); 

---編輯-----------------

所以,是的,你可以修改dbData類根據需要添加(或刪除)儘可能多的屬性或方法,並且不會破壞代碼。

+0

是ArrayAdapter 已設置。最後,我想我幾乎可以理解這些代碼是如何工作的。 C#和Java是相似的,但是語法有時會拋出。 – 2015-02-12 16:48:07