我是Java的新手,所以如果这是一个愚蠢的问题,请原谅。 我上了这堂课:
public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem> {
Context context;
List<DrawerItem> drawerItemList;
int layoutResID;
private FriendInfo[] friends = null;
public void setFriendList(FriendInfo[] friends)
{
this.friends = friends;
}
public int getCount() {
return friends.length;
}
public FriendInfo getItem(int position) {
return friends[position];
}
public long getItemId(int position) {
return 0;
}
public CustomDrawerAdapter(Context context, int layoutResourceID,
List<DrawerItem> listItems) {
super(context, layoutResourceID, listItems);
this.context = context;
this.drawerItemList = listItems;
this.layoutResID = layoutResourceID;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
DrawerItemHolder drawerHolder;
View view = convertView;
if (view == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
drawerHolder = new DrawerItemHolder();
view = inflater.inflate(layoutResID, parent, false);
drawerHolder.ItemName = (TextView) view
.findViewById(R.id.drawer_itemName);
drawerHolder.icon = (ImageView) view.findViewById(R.id.drawer_icon);
view.setTag(drawerHolder);
} else {
drawerHolder = (DrawerItemHolder) view.getTag();
}
DrawerItem dItem = (DrawerItem) this.drawerItemList.get(position);
drawerHolder.icon.setImageDrawable(view.getResources().getDrawable(
dItem.getImgResID()));
drawerHolder.ItemName.setText(friends[position].userName);
return view;
}
private static class DrawerItemHolder {
TextView ItemName;
ImageView icon;
}
在FriendInfo,我收到以下错误:&#34; &#39;的getItem(INT)&#39; in&#39;(我的包名).CustomDrawerAdapter&#39;与&#39; getItem(int)&#39;冲突在&#39; android.widget.ArrayAdapter&#39 ;;试图使用不兼容的返回类型&#34; 我是Java的新手,我不知道如何解决这个问题,有人可以帮助我吗?
答案 0 :(得分:2)
您的CustomDrawerAdapter扩展了ArrayAdapter&lt; T&gt; T是DrawerItem。 T是一个类型参数,当您定义CustomDrawerAdapter类时,它将替换为类型参数,类型参数在您的情况下为DrawerItem。
所以CustomDrawerAdapter基本上是一个适配器,用于从DrawerItems数组中显示项目。
ArrayAdapter定义了一个方法
public T getItem (int position)
将是
public DrawerItem getItem (int position)
为您的类CustomDrawerAdapter。
您可能希望阅读有关泛型的本教程:http://docs.oracle.com/javase/tutorial/java/generics。请注意,泛型不易理解,但在进行Android开发时,您绝对需要基本的理解。
如果您决定覆盖该方法,则无法更改返回值,除非该方法具有不同的签名(名称,加上其参数的数量和类型)。
你必须问自己:CustomDrawerAdapter是一个适配器从FriendInfo的数组(或列表)或DrawerItem数组中提取数据吗?根据答案,您的班级定义将是
public class CustomDrawerAdapter extends ArrayAdapter<DrawerItem>
或
public class CustomDrawerAdapter extends ArrayAdapter<FriendInfo>
使用这两个类来支持ArrayAdapter是没有意义的,除非FriendInfo正在扩展DrawerItem并且这似乎不太可能。 如果你真的需要第二个Objects(FriendInfo)数组用于任何目的,那么不要修改ArrayAdapter方法(比如getCount(),getItemId(int)或getItem(int)),除非你确切知道你在做什么。 例如。你的getCount()注定要失败,因为它返回的是FriendInfo []的大小,而不是DrawerItems的数量,而FriendInfo []可能没有相同数量的元素(在你调用setFriendList之前它肯定没有,并且保证传递的数组与您在构造函数中传递的List具有相同数量的元素?)。
答案 1 :(得分:1)
因为它扩展了ArrayAdapter<DrawerItem>
,所以getItem需要返回DrawerItem
。如果在扩展ArrayAdapter时无法找到解决此问题的简洁方法,则可以通过扩展BaseAdapter
来实现自己的适配器实现。