【问题标题】:getItem(int) clashes with getItem(int)getItem(int) 与 getItem(int) 冲突
【发布时间】:2014-04-10 02:15:21
【问题描述】:

我是 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 我收到以下错误:“'(My Package name).CustomDrawerAdapter' 中的 'getItem(int)' 与 'android.widget.ArrayAdapter' 中的 'getItem(int)' 发生冲突;尝试使用不兼容的返回类型” 我是 Java 新手,不知道如何解决这个问题,有人可以帮助我吗?

【问题讨论】:

    标签: java android


    【解决方案1】:

    您的 CustomDrawerAdapter 扩展了 ArrayAdapter,其中 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 并且这似乎不太可能。 如果您真的需要第二个对象数组 (FriendInfo) 用于任何目的,那么除非您确切知道自己在做什么,否则不要修改 ArrayAdapter 方法(如 getCount()、getItemId(int) 或 getItem(int))。 例如。您的 getCount() 注定要失败,因为它返回 FriendInfo[] 的大小而不是 DrawerItems 的数量,而 FriendInfo[] 可能没有相同数量的元素(在您调用 setFriendList 之前它肯定没有,谁保证传递的数组与构造函数中传递的 List 具有相同数量的元素?)。

    【讨论】:

      【解决方案2】:

      因为它扩展了ArrayAdapter&lt;DrawerItem&gt;,getItem 需要返回一个DrawerItem。如果您在扩展 ArrayAdapter 时找不到解决此问题的干净方法,则可以通过扩展 BaseAdapter 轻松实现自己的适配器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多