Android, как использовать карту в "базовом адаптере"?
Я пытаюсь получить json с динамическими объектами в Android. Поэтому я использую Map<>
, чтобы получить json. Я хочу использовать карту внутри BaseAdapter
. Я получаю следующую ошибку
Incompatible types.Required:com.example.EffectList. Found:java.util.Map< java.lang.String,java.util.List< com.example.EffectList >>
Это мой базовый адаптерный код:
public class MyContactAdapter2 extends BaseAdapter {
List<Map<String, List<EffectList>>> contactList;
Context context;
private LayoutInflater mInflater;
// Constructors
public MyContactAdapter2(Context context, List<Map<String, List<EffectList>>> objects) {
this.context = context;
this.mInflater = LayoutInflater.from(context);
contactList = objects;
}
@Override
public int getCount() {
return contactList.size();
}
@Override
public Map<String, List<EffectList>> getItem(int position) {
return contactList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final MyContactAdapter2.ViewHolder vh;
if (convertView == null) {
View view = mInflater.inflate(R.layout.get_layout_row_view, parent, false);
vh = MyContactAdapter2.ViewHolder.create((RelativeLayout) view);
view.setTag(vh);
} else {
vh = (MyContactAdapter2.ViewHolder) convertView.getTag();
}
EffectList item = getItem(position); // COMPILE TIME ERROR HERE
vh.textViewName.setText(item.getEffectsId());
vh.textViewEmail.setText(item.getEffectsName());
return vh.rootView;
}
private static class ViewHolder {
public final RelativeLayout rootView;
public final ImageView imageView;
public final TextView textViewName;
public final TextView textViewEmail;
private ViewHolder(RelativeLayout rootView, ImageView imageView, TextView textViewName, TextView textViewEmail) {
this.rootView = rootView;
this.imageView = imageView;
this.textViewName = textViewName;
this.textViewEmail = textViewEmail;
}
public static MyContactAdapter2.ViewHolder create(RelativeLayout rootView) {
ImageView imageView = (ImageView) rootView.findViewById(R.id.imageView);
TextView textViewName = (TextView) rootView.findViewById(R.id.textViewName);
TextView textViewEmail = (TextView) rootView.findViewById(R.id.textViewEmail);
return new MyContactAdapter2.ViewHolder(rootView, imageView, textViewName, textViewEmail);
}
}
}
Что не так в моем коде?
1 ответ:
Ну его довольно просто, ваш
getItem
метод возвращает объект типаMap<String, List<EffectList>>
, вы не можете привести этот тип непосредственно кEffectList
.Что-то вроде этого требуется для получения элемента списка эффектов:
EffectList item = getItem(position).get("somekey").get(0);
Решения
- получить что-то из
Map
, а затем изList
, что является внутриMap
.- измените метод BaseAdapter
getItem
, чтобы вернуть объект типаEffectList
, и измените методgetCount
, чтобы вернуть правильный элемент граф;Несколько побочных заметок:
Я предлагаю вам переосмыслить и перепроектировать свою структуру данных, действительно ли вам нужен
List
, который содержитMap
, который содержитList
?- лично я бы не использовал
Map
Для поддержкиAdapter
, порядок элементов вMap
(часто) не определен (если вы не используете реализациюMap
, где порядок определен);