【问题标题】:NullpointerException in ArrayAdapter and listviewArrayAdapter 和列表视图中的 NullpointerException
【发布时间】: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


【解决方案1】:

替换

arrayAdapter = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_activated_1, userNames);

arrayAdapter = new ArrayAdapter(Show_user_lists.this, android.R.layout.simple_list_item_activated_1, userNames);

它很可能会解决您的问题。

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多