【发布时间】:2013-04-21 01:27:56
【问题描述】:
这是我第一次使用 ListFragments,我遇到了一个错误。 所以我的问题是为什么我在这行代码上得到了一条红线?
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, model.getIncidents()));
上面写着The constructor ArrayAdapter<String>(Activity, int, ArrayList<Incident>) 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)
我终其一生都无法弄清楚他们在第一行所说的内容。我没有看到任何名为 list 的 R.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<Incident>(...)。 -
关于您的新问题:如果您对布局文件进行了任何更改,请在
@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