【发布时间】:2016-09-29 21:20:56
【问题描述】:
我正在尝试使用 listview 从 Parse 数据库中打印用户名。但是我的代码显示 NullPointerException 我不知道如何解决。请帮忙!
Java:
package com.parse.starter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.parse.FindCallback;
import com.parse.ParseException;
import com.parse.ParseQuery;
import com.parse.ParseUser;
import java.util.ArrayList;
import java.util.List;
public class Show_user_lists extends AppCompatActivity {
ArrayList<String> userNames;
ArrayAdapter arrayAdapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_users_list);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar bar = getSupportActionBar();
bar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#26A69A")));
bar.setDisplayHomeAsUpEnabled(true);
listView = (ListView) findViewById(R.id.listView);
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.whereNotEqualTo("username", ParseUser.getCurrentUser().getUsername());
query.addAscendingOrder("username");
userNames = new ArrayList<>();
arrayAdapter = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_activated_1, userNames);
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(List<ParseUser> objects, ParseException e) {
if (e == null) {
if (objects.size() > 0) {
for (ParseUser user : objects) {
userNames.add(user.getUsername());
Log.i("uname", String.valueOf(user.getUsername()));
}
try {
listView.setAdapter(arrayAdapter);
} catch (Exception ex) {
ex.printStackTrace();
}
}
} else {
e.printStackTrace();
}
}
});
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//int id = item.getItemId();
return super.onOptionsItemSelected(item);
}
}
还有错误:
09-30 02:00:24.649 23273-23273/com.parse.starter E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.parse.starter, PID: 23273
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
at com.parse.starter.Show_user_lists$1.done(Show_user_lists.java:47)
at com.parse.starter.Show_user_lists$1.done(Show_user_lists.java:38)
at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:116)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
09-30 02:00:27.020 23273-23273/com.parse.starter I/Process:发送信号。 PID:23273 SIG:9
我的 Logcat 用于 db 中的用户名:
09-30 03:02:17.514 22462-22462/com.parse.starter I/uname: qWtBPbvjcPwQ1YVxdqvfkEsBE
09-30 03:02:17.515 22462-22462/com.parse.starter I/uname: qwerty
09-30 03:02:17.515 22462-22462/com.parse.starter I/uname: satsan
【问题讨论】:
-
关于这一行:“listView = (ListView) findViewById(R.id.listView);”您确定您的数据库找到了该 ID 的视图吗?
-
是的,它确实...我已经尝试并注销了arraylist中的名称...它有效
-
它看起来像一个线程问题..this 'FindCallback
' 可能正在'background'线程上执行'done'..因此它不会看到'arrayAdapter'值(写在 UI 线程上)。 -
所以..要修复它,您可以做一个“丑陋的热修复”,将变量设置为“易失性”(volatile ArrayAdapter arrayAdapter;),或者使用专门用于处理“背景”和“UI 线程”问题。
-
你试过在 done 方法中初始化 arrayAdapter
标签: java android listview nullpointerexception android-arrayadapter