gpt4 book ai didi

java - Android 用自定义ArrayAdapter填充listView

转载 作者:行者123 更新时间:2023-12-01 10:04:13 24 4
gpt4 key购买 nike

我正在尝试用我创建的自定义数组适配器填充我的listView。我想要的结果是左侧有一个图像,右侧有两个标签。

当我到达应该显示 listView 的片段时,应用程序崩溃了,但我无法真正找出原因。错误为java.lang.IllegalStateException:系统服务在onCreate()之前不可用于 Activity

这是我的代码:

片段:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getActivity().setTitle("Inbox");

myView = inflater.inflate(R.layout.inbox_layout, container, false);

ListView list = (ListView) myView.findViewById(R.id.listViewMyAccount);
inboxCellElement[] elts = new inboxCellElement[] {new inboxCellElement(R.drawable.ic_menu_camera, "Val", "Hi !")};
list.setAdapter(new inboxCellAdapter(new NavDrawer(), R.layout.inbox_cell_layout, elts, (NavDrawer) getActivity()));

return myView;
}

包含要传递给 listView 的数据的对象:

public class inboxCellElement {
private String name = "", message = "";
private int imgId = 0;

public inboxCellElement(int imgId, String name, String message){
this.imgId = imgId;
this.name = name;
this.message = message;
}

public int getImgId() { return imgId; }
public String getName() { return name; }
public String getMessage() { return message; }
}

自定义适配器:

public class inboxCellAdapter extends ArrayAdapter {
inboxCellElement[] elts;
NavDrawer navDrawer;

// constructor
public inboxCellAdapter(Context context, int resource, Object[] objects, NavDrawer navDrawer) {
super(context, resource, objects);
elts = (inboxCellElement[]) objects;
this.navDrawer = navDrawer;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holder = null;
LayoutInflater inflater = new NavDrawer().getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.inbox_cell_layout, null, false);
holder = new MyHolder(convertView);
convertView.setTag(holder);
}
else {
holder = (MyHolder) convertView.getTag();
}
holder.getUpperText().setText(elts[position].getName());
holder.getLowerText().setText(elts[position].getMessage());
holder.getImage().setImageResource(elts[position].getImgId());

return convertView;
}

private class MyHolder {
private View row;
private TextView upperText = null, lowerText = null;
private ImageView img = null;

public MyHolder(View row) {
this.row = row;
}

public TextView getUpperText() {
if (this.upperText == null) {
this.upperText = (TextView) navDrawer.findViewById(R.id.inboxCellName);
}
return this.upperText;
}

public TextView getLowerText() {
if (this.lowerText == null) {
this.lowerText = (TextView) navDrawer.findViewById(R.id.inboxCellMessage);
}
return this.lowerText;
}

public ImageView getImage() {
if (this.img == null) {
this.img = (ImageView) navDrawer.findViewById(R.id.inboxCellImg);
}
return this.img;
}
}
}

该错误似乎来自多个 navDrawer.findViewById(...) 调用,但我不知道如何修复它。任何人都可以确认错误发生在这里,为什么并帮助我修复它?谢谢

编辑:添加堆栈跟踪

---------崩溃开始

04-12 14:32:58.816 2128-2128/t2g.com.travel2gather E/AndroidRuntime: FATAL EXCEPTION: main
Process: t2g.com.travel2gather, PID: 2128
java.lang.IllegalStateException: System services not available to Activities before onCreate()
at android.app.Activity.getSystemService(Activity.java:5253)
at android.view.LayoutInflater.from(LayoutInflater.java:229)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:178)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:137)
at t2g.com.travel2gather.adapters.inboxCellAdapter.<init>(inboxCellAdapter.java:0)
at t2g.com.travel2gather.inboxFragment.onCreateView(inboxFragment.java:30)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

最佳答案

您不能使用 Activity 的构造函数来提供上下文(正如您在评论中所说的NavDrawer 是您的MainActivity)。所以像这样改变这个onCreateView

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
getActivity().setTitle("Inbox");

myView = inflater.inflate(R.layout.inbox_layout, container, false);

ListView list = (ListView) myView.findViewById(R.id.listViewMyAccount);
inboxCellElement[] elts = new inboxCellElement[] {new inboxCellElement(R.drawable.ic_menu_camera, "Val", "Hi !")};
list.setAdapter(new inboxCellAdapter(getActivity(), R.layout.inbox_cell_layout, elts, (NavDrawer) getActivity()));

return myView;
}

在您的适配器中也是如此:

public class inboxCellAdapter extends ArrayAdapter {
inboxCellElement[] elts;
NavDrawer navDrawer;
Activity activity;

// constructor
public inboxCellAdapter(Activity activity, int resource, Object[] objects, NavDrawer navDrawer) {
super(context, resource, objects);
this.activity = activity;
elts = (inboxCellElement[]) objects;
this.navDrawer = navDrawer;
}

因此 getView 将类似于:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holder = null;
LayoutInflater inflater = activity.getLayoutInflater();

关于java - Android 用自定义ArrayAdapter填充listView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36572938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com