从 getAdapter 到我的通用 class 的转换是如何工作的

How does the casting work from getAdapter to my generic class

我在 .net 中做了很多转换——主要是从通用对象向下转换为更具体的对象,我知道这会起作用。但是我从来没有转换成我自己的 class 直到现在我在 Android 中从示例中整理了一些代码。

我似乎找不到很好的例子来展示与正在转换的 classes 的代码一起进行转换。基本上,我试图准确理解在这种情况下转换是如何工作的,因为我想修改下面称为 dbData 的 class 以包含其他变量和方法,但不确定它将如何影响 onClick 方法中的转换以下。 onClick 方法位于 Activity 中,其中包含一个 listView 和几个按钮。这些按钮要么添加一个 listView 项,要么删除第一个 listView 项。删除项目时,它会发送有问题的转换 dbData = (dbData) lstView.getAdapter().getItem(0);

dbData 是我的 class 是从一个例子中派生出来的。我无法理解的部分是演员表似乎成功地用演员表填充了变量 id 和 dbData 。

  1. 它怎么知道要这么做的?基本问题,但似乎找不到详细说明。如果 dbData 只是一个字符串,而 getItem(0) 只返回一个字符串,那似乎是显而易见的。但在这种情况下,它填充字符串 "dbData" 和整数 "id"

  2. 我可以从转换中填充额外的变量或对象吗?这个问题是理论上的;意思是,如果我可以抓取其他变量,我怎么知道我可以抓取哪些变量,是否有任何特殊的技术来定义 dbData 中的变量?

  3. 我可以将其他变量和 classes 添加到 dbData class 而不会弄乱演员表,或者在演员表中无意中填充这些变量吗?我怎么确定会那样做?

希望我只是想具体了解演员表是如何工作的这一事实在我的问题中得到了体现。感谢您的帮助!

这是带有上述转换的 activity 代码:

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 class:

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(或派生的 class),上面的转换都会起作用。

关于 dbData...您没有将适配器转换为 dbData。您正在获取适配器 (ArrayAdapter),检索项目并将其转换为 dbData:

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

因此,由于您的 ArrayAdapter 包含 dbData 对象,转换也将起作用。

这段代码等价于:

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

--- 编辑 ------------------

所以,是的,您可以修改 dbData class 以根据需要添加(或删除)任意数量的属性或方法,并且不会破坏代码。