【问题标题】:Android ListFragment ErrorsAndroid ListFragment 错误
【发布时间】:2013-04-21 01:27:56
【问题描述】:

这是我第一次使用 ListFragments,我遇到了一个错误。 所以我的问题是为什么我在这行代码上得到了一条红线?

setListAdapter(new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, model.getIncidents()));

上面写着The constructor ArrayAdapter&lt;String&gt;(Activity, int, ArrayList&lt;Incident&gt;) is undefined

编辑

我不再收到此片段的上述错误。我稍微修改了代码,现在看起来像这样:

public class Incidents_Frag extends ListFragment {
View view;
public static Model model;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {        
    view = inflater.inflate(R.layout.incid, container, false);
    model = new Model();
    setListAdapter(new ArrayAdapter<Incident>(getActivity(),
            android.R.layout.simple_list_item_1, model.getIncidents()));        
    return view;
}
}

但是现在我得到一个运行时错误。 logcat 在下面

04-21 18:47:40.934: E/AndroidRuntime(806): FATAL EXCEPTION: main
04-21 18:47:40.934: E/AndroidRuntime(806): java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.ListFragment.ensureList(ListFragment.java:402)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.ListFragment.onViewCreated(ListFragment.java:203)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:809)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:998)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.BackStackRecord.run(BackStackRecord.java:622)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1330)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.FragmentManagerImpl$1.run(FragmentManager.java:417)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.os.Handler.handleCallback(Handler.java:605)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.os.Looper.loop(Looper.java:137)
04-21 18:47:40.934: E/AndroidRuntime(806):  at android.app.ActivityThread.main(ActivityThread.java:4340)
04-21 18:47:40.934: E/AndroidRuntime(806):  at java.lang.reflect.Method.invokeNative(Native Method)
04-21 18:47:40.934: E/AndroidRuntime(806):  at java.lang.reflect.Method.invoke(Method.java:511)
04-21 18:47:40.934: E/AndroidRuntime(806):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-21 18:47:40.934: E/AndroidRuntime(806):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-21 18:47:40.934: E/AndroidRuntime(806):  at dalvik.system.NativeStart.main(Native Method)

我终其一生都无法弄清楚他们在第一行所说的内容。我没有看到任何名为 listR.id 文件。我现在相信我只需要在某个地方放置一个列表视图或文本视图。 感谢您提供的任何帮助

编辑

这是我的片段的新代码

public class Incidents_Frag extends ListFragment {
View view;
public static Model model;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {        
    view = inflater.inflate(R.layout.incid, container, false);
    model = new Model();
    setListAdapter(new ArrayAdapter<Incident>(getActivity(),
            android.R.layout.simple_list_item_1, model.getIncidents()));        
    return view;
}

public class MyArrayAdapter extends ArrayAdapter<Item> {
    ArrayList<Incident> items;
    Context context;
    public MyArrayAdapter(Context context, int textViewResourceId,
            ArrayList<Incident> items) {
        super(context, textViewResourceId, items);

        this.context = context;
        this.items = items; 
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        ViewHolder holder = new ViewHolder();
        Item item = items.get(position);

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(R.layout.list_item, parent, false);
            holder.userName = (TextView) row.findViewById(R.id.name);
            row.setTag(holder);
        }
        else
        { 
            holder = (ViewHolder) row.getTag();
        }

        holder.name.setText(item.getName());
        return row;
    }

    public static class ViewHolder
    {
        TextView name;
    }

    public int getCount() {
        return items.size();
    }

}
}

下面有红线 Item item = items.get(position);

holder.userName = (TextView) row.findViewById(R.id.name);
“无法解析用户名”

holder.name.setText(item.getName());
"对于 ClipData.Item 类型的方法 getName() 未定义"

public static class ViewHolder
"成员类型 ViewHolder 不能声明为静态;静态类型只能声明为静态或顶级类型"

因此,如果我们能够清除这些红线,它可能会奏效,也可能不会奏效。如果您希望我继续走这条路,请告知此代码是否在正确的位置,以及需要进行哪些编辑

【问题讨论】:

  • ArrayAdapter 是一个类型化类,因此为了让构造函数接受Incident 对象列表,您需要调用:new ArrayAdapter&lt;Incident&gt;(...)
  • 关于您的新问题:如果您对布局文件进行了任何更改,请在 @android 命名空间中搜索任何 id。特别要注意看起来像 @android:id/list 的 id。该错误表明您为某些视图提供了一个 ID,ListFragment 使用该 ID 来识别布局文件中的 ListView。我会在R.layout.incid (incid.xml) 中开始搜索。
  • @MH 是的,我认为错误似乎很明显,我无法理解的是这个列表片段的xml 文件是空的。它只是定义了线性布局。在任何其他活动/片段中也没有列表视图,它们可以工作/显示它们应该做的事情。
  • 如果您的 xml 文件为空,则不要将其用作片段的视图。您应该对包含 ListView 且 id 为 @android:id/list 的布局进行扩展,或者通过不扩展自定义布局让 ListFragment 使用其预定义的布局。更多详情请参考this Screen Layout section in the docs

标签: android android-fragments android-listfragment


【解决方案1】:

默认构造函数只接受一个字符串数组。您可以传递一个“事件”数组,从而导致该错误。

您必须实现自己的 ArrayAdapter,它接受对象类型“事件”的数组。

扩展的 ArrayAdapter 示例如下所示。

public class MyArrayAdapter extends ArrayAdapter<Incident> { // changed from Item to Incident
    ArrayList<Incident> items;
    Context context;
    public MyArrayAdapter(Context context, int textViewResourceId,
            ArrayList<Incident> items) {
        super(context, textViewResourceId, items);

        this.context = context;
        this.items = items; 
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        ViewHolder holder = new ViewHolder();
        Incident item = items.get(position); // item is your accident

        if(row == null)
        {
            LayoutInflater inflater = ((Activity)context).getLayoutInflater();
            row = inflater.inflate(R.layout.list_item, parent, false);
            holder.name = (TextView) row.findViewById(R.id.name); // updated it is name from holder class
            row.setTag(holder);
        }
        else
        {
            holder = (ViewHolder) row.getTag();
        }

        holder.name.setText(item.getName()); // this is just example item is your Incident, you have to get it's name function whatever that is in your class
        return row;
    }

    public static class ViewHolder
    {
        TextView name;
    }

    public int getCount() {
        return items.size();
    }

}

您必须为此创建自己的布局。对于上面的例子,创建 list_item.xml 并添加一个带有 id 名称的 TextView 就可以了。

【讨论】:

  • 当我尝试制作自定义适配器时,我遇到了更多错误和一些我不完全理解的代码。不过,我很欣赏这种努力。查看编辑后的帖子,我认为我在正确的轨道上,只需要一点指导
  • 默认适配器无法理解您的事件对象。它只接受字符串。您将必须创建自己的适配器。使用上面的代码并使用新代码和错误更新您的问题。它会起作用的。
  • 更新了新的片段代码,请告诉我下一步是什么,因为我现在的代码中有很多红线
  • 我只是要废弃这个并将其变成一个新问题。现在这已成为一个完全不同的问题
  • 我更新了我的答案。这是我项目中的代码,其中我的对象是项目,但在您的程序中是事件。因此,您必须相应地更新此代码。您也可以在 Google 上搜索自定义 ArrayAdapter 的 Google 示例,它会对您有所帮助,因为这正是您在 ArrayList 中处理自己的对象所需要的。
猜你喜欢
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多