簡體   English   中英

從getAdapter到通用類的轉換如何工作

[英]How does the casting work from getAdapter to my generic class

我已經在.net中進行了很多轉換-大多是將通用對象向下轉換為更具體的對象,而我知道這是可行的。 但是直到現在我在Android中將示例中的一些代碼組合在一起,我才開始講授自己的課程。

我似乎找不到很好的示例來顯示強制轉換以及與要強制轉換的類的代碼。 基本上,我想精確地了解這種情況下的轉換方式,因為我想修改下面的類dbData來包含其他變量和方法,但不確定如何影響下面的onClick方法中的轉換。 onClick方法位於包含listView和幾個按鈕的Activity中。 這些按鈕可以添加一個listView項目或刪除第一個listView項目。 刪除項目時,它將發送此有問題的演員表dbData =(dbData)lstView.getAdapter()。getItem(0);

dbData是我的類,它是從一個示例派生的。 我無法理解的部分是,強制轉換似乎已成功地將變量id和dbData填充了強制轉換。

  1. 它怎么知道這樣做? 基本問題,但似乎找不到詳細的描述。 如果dbData只是一個字符串,而getItem(0)僅返回一個字符串,這似乎很明顯。 但是在這種情況下,它會填充字符串“ dbData”和整數“ id”

  2. 我可以從演員表中填充其他變量或對象嗎? 這個問題是理論上的。 意思是,如果我可以獲取其他變量,我將如何知道可以獲取哪些變量,並且是否有任何特殊的技術來定義dbData中的變量?

  3. 是否可以在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;
    }

}

您的代碼中有兩個強制轉換。

您正在使用包含dbData對象的通用ArrayAdapter:

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類以添加(或刪除)所需的任意數量的屬性或方法,並且不會破壞代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM