我已经在.net中做了很多演员 - 主要是从通用对象转向更具体的对象,我知道它会起作用。但是,直到现在我在Android中已经将一些代码放在一起,我从未投入到我自己的班级。
我似乎无法找到显示强制转换的示例,这些示例附带了正在强制转换的类的代码。基本上,我试图在这种情况下精确理解转换是如何工作的,因为我想修改下面的类dbData以包含其他变量和方法,但我不确定它将如何影响下面的onClick方法中的转换。 onClick方法位于包含listView和几个按钮的Activity中。按钮要么添加listView项,要么删除第一个listView项。当删除该项时,它会发送有问题的演员dbData =(dbData)lstView.getAdapter()。getItem(0);
dbData是我的一个派生自一个例子的类。我无法理解的部分是强制转换似乎成功地使用强制转换填充了变量id和dbData。
怎么知道这样做?基本问题,但似乎无法找到详细说明。如果dbData只是一个字符串,并且getItem(0)只返回一个字符串,那看起来很明显。但在这种情况下,它填充字符串" dbData"和整数" id"
我可以从演员表中填充其他变量或对象吗?这个问题是理论上的;意思是,如果我能抓住其他变量,我怎么知道我能抓到哪些变量,是否有任何特殊的技术来定义dbData中的变量?
我可以将其他变量和类添加到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;
}
}
答案 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类来添加(或删除)你需要的许多属性或方法,它不会破坏代码。