2015-02-12 79 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