getItem(int)与getItem(int)冲突

时间:2014-04-10 02:15:21

标签: java android

我是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的新手,我不知道如何解决这个问题,有人可以帮助我吗?

2 个答案:

答案 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来实现自己的适配器实现。