2016-03-10 6 views
1

У меня есть адаптер просмотра списка, который многократно используется для некоторых действий и отображает различные макеты на основе разных элементов группы. Поскольку представление списка адаптер требует гибкости в структуре сбора, я решил использовать дженериков подстановочные для коллекции:Могу ли я передать список <Model> функции, которая принимает общий подстановочный список. <?>

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() вернуть Map<String, List<? extends Model>>, но по-прежнему получать несовместимый тип ошибки.

+1

Вы пытались «Карта > '? –

ответ

2

Когда вы объявляете listCollection как Map<String, List<?>>, вы объявляете, что тип значения отображения должен быть точноList<?>. Подстановочный шаблон на самом деле вас не очень устраивает. Чтобы получить гибкость типа, которую вы хотите, вам нужен дополнительный шаблон: Map<String, ? extends List<?>>.

Обратите внимание, что с помощью этого шаблона вы сможете извлекать списки с карты, но не добавлять в нее списки.

Смежные вопросы