我有一个列表视图适配器,可以在某些活动中重用,并根据不同的组项呈现不同的布局。由于列表视图适配器需要灵活的集合结构,我决定使用泛型通配符进行集合:
ToServerTime()
这是问题所在。我有一个函数返回适配器的两级关联数组。它返回public ExpandableListAdapter(FragmentActivity context, List<String> group,
Map<String, List<?>> listCollection) {
this.context = context;
this.dataCollections = listCollection;
}
。模型是一种映射模型。
Map<String, List<Model>>
我了解来自public Map<String, List<Model>> getAll() {
Map<String, List<Model>> listCollection = new HashMap<String,List<Model>>();
/***Database Query***/
List<Model> rowList = new ArrayList<Model>();
try {
if (cursor.moveToFirst()) {
do {
Model sf = new Model();
sf.title = cursor.getString(cursor.getColumnIndex("title");
sf.group_title = DBMethod.getString(cursor,getColumnIndex("group"));
rowList.add(sf);
Model group = (Model)listCollection.get(sf.group_title);
if(group == null){
listCollection.put(sf.group_title,rowList);
}else{
listCollection.get(sf.group_title).add(sf);
}
} while(cursor.moveToNext());
}
} catch (Exception e) {
Log.d(TAG, "Error while trying to get posts from database");
} finally {
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
}
return listCollection;
}
public class Model{
public String title;
public String value;
public String group_title;
}
(getAll()
)的返回数组与Map<String, List<Model>>
(ExpandableListAdapter
)所需的通配符集合不匹配。但它是否仍然可以将其传递到适配器?我在这段代码中遇到不兼容的类型错误:
Map<String, List<?>>
我尝试修改Map<String, List<Model>> listCollection = getAll();
ExpandableListView expListView = (ExpandableListView) findViewById(R.id.left_drawer);
final ExpandableListAdapter expListAdapter = new ExpandableListAdapter(
this, groupList, listenCollection);
^^^^^^^^^^^
expListView.setAdapter(expListAdapter);
以返回getAll()
,但仍然遇到不兼容的类型错误。
答案 0 :(得分:2)
当您将listCollection
声明为Map<String, List<?>>
时,您声明地图的值类型必须完全 List<?>
。那里的通配符实际上并没有带给你太多。要获得所需的类型灵活性,您需要一个额外的通配符:Map<String, ? extends List<?>>
。
请注意,使用此通配符,您可以从地图中检索列表,但不能向其中添加列表。