我有一个列表,我需要添加到列表视图中,并且从不同的类中获取的数组列表是我的代码:
public class AdminUserDetails extends AppCompatActivity {
ListView listView;
List<String>userlist;
public static final String TAG="userdetails";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_user_details);
if (android.os.Build.VERSION.SDK_INT > 9)
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
listView=findViewById(R.id.list_item2);
String task= "adminuserdetails";
BackgroundTask backgroundTask= new BackgroundTask(this);
backgroundTask.execute(task);
// ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(AdminUserDetails.this,android.R.layout.simple_list_item_1,userlist);
// listView.setAdapter(arrayAdapter);
// ArrayList<String> userlist= new ArrayList<String>(backgroundTask1.arraylist);
// Log.d(TAG,userlist.toString());
}
public void getArrayList(List<String> arrayList){
userlist= arrayList;
Log.d(TAG,userlist.toString());
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(AdminUserDetails.this,android.R.layout.simple_list_item_1,userlist);
listView.setAdapter(arrayAdapter);
}
}
我收到此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.a49ersense, PID: 28978
java.lang.IllegalStateException: System services not available to Activities before onCreate()
at android.app.Activity.getSystemService(Activity.java:6636)
at android.view.LayoutInflater.from(LayoutInflater.java:284)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:216)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:210)
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:196)
at com.example.a49ersense.AdminUserDetails.getArrayList(AdminUserDetails.java:45)
at com.example.a49ersense.BackgroundTask.onPostExecute(BackgroundTask.java:308)
at com.example.a49ersense.BackgroundTask.onPostExecute(BackgroundTask.java:28)
at android.os.AsyncTask.finish(AsyncTask.java:755)
at android.os.AsyncTask.access$900(AsyncTask.java:192)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
我在arrayadapter遇到错误,请帮助我解决这个错误并指出我做错了什么地方。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
错误信息显示为 "java.lang.IllegalStateException: System services not available to Activities before onCreate()",这通常意味着你尝试在 Activity 的正确生命周期之外访问系统服务或资源。在你的代码中,问题出在 getArrayList(List arrayList)
方法里创建 ArrayAdapter
的部分。
错误发生是因为你可能在 BackgroundTask
的 onPostExecute()
方法中调用了 getArrayList()
,此时你直接使用了 Activity
的上下文来实例化 ArrayAdapter
,而没有确保这个操作发生在 Activity
生命周期的适当阶段(如 onCreate()
之后)。
要解决这个问题,请确保你只在 Activity
生命周期内安全的时刻调用更新 UI 的方法。你可以通过以下方式修改:
确认回调时机:确保 BackgroundTask
中的 onPostExecute()
调用 getArrayList()
时,AdminUserDetails
的 onCreate()
已经完成执行。如果需要,可以在 onPostExecute()
开始时添加日志检查当前状态。
直接在 onPostExecute()
更新 UI:考虑将更新列表视图的逻辑直接放在 onPostExecute()
内部,而不是通过一个单独的方法。这样可以确保当此代码执行时,Activity
已经完全初始化完毕。
下面是修改后的示例代码,直接在 onPostExecute()
中处理数组列表和设置适配器:
public class AdminUserDetails extends AppCompatActivity {
ListView listView;
List<String> userlist; // 假设List的具体类型是String,根据实际情况调整
public static final String TAG = "userdetails";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_user_details);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
listView = findViewById(R.id.list_item2);
String task = "adminuserdetails";
BackgroundTask backgroundTask = new BackgroundTask(this);
backgroundTask.execute(task);
}
class BackgroundTask extends AsyncTask<String, Void, List<String>> { // 假设返回类型是List<String>
// ... 其他原有代码 ...
@Override
protected void onPostExecute(List<String> result) {
super.onPostExecute(result);
if (result != null && !result.isEmpty()) {
userlist = result;
Log.d(TAG, userlist.toString());
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(AdminUserDetails.this, android.R.layout.simple_list_item_1, userlist);
listView.setAdapter(arrayAdapter);
}
}
}
}
这样修改后,你不再需要 getArrayList()
方法,因为 UI 更新逻辑已经整合到了 onPostExecute()
中,确保了在正确的时机使用了 Activity 上下文。