如何从getAdapter转换到我的泛型类

时间:2015-02-12 05:28:50

标签: java android oop casting

我已经在.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类而不会搞乱演员表,或者在演员表中无意中填充了这些变量吗?我怎么能肯定这样做?

  4. 希望我在问题中能够完全理解演员如何运作这一事实。谢谢你的帮助!

    这里是上面提到的演员的活动代码:

    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 个答案:

答案 0 :(得分:1)

您的代码中有两个转换。

您正在使用通用ArrayAdapter包含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类来添加(或删除)你需要的许多属性或方法,它不会破坏代码。