Android, 如何在 `BaseAdapter` 中使用 Map?
Android, how to use a Map in a `BaseAdapter`?
我正在尝试使用 Android 中的动态对象获取 json。所以我使用 Map<>
来获取 json。我想使用 BaseAdapter
内的地图。我收到以下错误
Incompatible types.Required:com.example.EffectList. Found:java.util.Map< java.lang.String,java.util.List< com.example.EffectList >>
这是我的 BaseAdapter 代码:
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);
}
}
}
我的代码有什么问题?
嗯,这很简单,您的 getItem
方法 return 是类型 Map<String, List<EffectList>>
的对象,您不能将此类型直接转换为 EffectList
。
获得 EffectList 项目需要这样的东西:
EffectList item = getItem(position).get("somekey").get(0);
解决方案
- 从
Map
中得到一些东西,然后从 List
中得到一些东西
在 Map
. 里面
- 将您的 BaseAdapter
getItem
方法修改为 return EffectList
类型的对象,并将您的 getCount
方法修改为 return 正确的项目计数;
一些旁注:
- 我建议你重新考虑并重新设计你的数据结构,你真的需要一个
List
包含一个 Map
包含一个 List
吗?
- 我个人不会使用
Map
来支持 Adapter
,Map
中的项目顺序(通常)未定义(除非您使用 Map
定义顺序的实现);
我正在尝试使用 Android 中的动态对象获取 json。所以我使用 Map<>
来获取 json。我想使用 BaseAdapter
内的地图。我收到以下错误
Incompatible types.Required:com.example.EffectList. Found:java.util.Map< java.lang.String,java.util.List< com.example.EffectList >>
这是我的 BaseAdapter 代码:
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);
}
}
}
我的代码有什么问题?
嗯,这很简单,您的 getItem
方法 return 是类型 Map<String, List<EffectList>>
的对象,您不能将此类型直接转换为 EffectList
。
获得 EffectList 项目需要这样的东西:
EffectList item = getItem(position).get("somekey").get(0);
解决方案
- 从
Map
中得到一些东西,然后从List
中得到一些东西 在Map
. 里面
- 将您的 BaseAdapter
getItem
方法修改为 returnEffectList
类型的对象,并将您的getCount
方法修改为 return 正确的项目计数;
一些旁注:
- 我建议你重新考虑并重新设计你的数据结构,你真的需要一个
List
包含一个Map
包含一个List
吗? - 我个人不会使用
Map
来支持Adapter
,Map
中的项目顺序(通常)未定义(除非您使用Map
定义顺序的实现);