为什么我的ListView上的setAdapter()会产生NullPointerException?

时间:2017-10-04 09:33:34

标签: java android listview

我对这种情况感到困惑。下面的代码工作正常,但Android Studio警告我setAdapter()可能会产生'java.lang.NullPointerException':

public class PlayerManagement extends AppCompatActivity {
    private Cursor c;
    private SQLiteDatabase db;
    private String selectedPlayerId, selectedPlayerName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player_management);
        ListView listView = (ListView) findViewById(android.R.id.list);

        try {
            MTGPS_DBHelper dbHelper = new MTGPS_DBHelper(this);
            db = dbHelper.getWritableDatabase();
            new getPlayersCursorAsync().execute();

            final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(PlayerManagement.this, android.R.layout.simple_list_item_1, c,
                                       new String[]{MTGPS_DB_Contract.Player.COLUMN_NAME_PLAYER_NAME},
                                       new int[]{android.R.id.text1}, 0);
        listView.setAdapter(mAdapter);

...

这是XML文件activity_player_management:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_players_found"
        android:textSize="25sp" />

</LinearLayout>

正如我所说,一切正常,但我不明白为什么Android Studio会提醒我。如果我将ListView声明为类字段,那么“问题”就会消失。只有当我在onCreate方法中声明Listview时才会收到警报。

5 个答案:

答案 0 :(得分:1)

  

setAdapter()可能会产生&#39; java.lang.NullPointerException

这只是一个警告。 findViewById()会返回@Nullable,即可能null并且您在没有无效检查的情况下在返回值上调用方法。

您可以取消警告,例如通过添加

//noinspection ConstantConditions

在上一行。

  

如果我将ListView声明为类字段,那么&#34;问题&#34;消失。只有当我在onCreate方法中声明Listview时才会收到警报。

无效分析器无法查看字段的写入位置,也不会产生警告。对局部变量的分析更容易。

答案 1 :(得分:0)

android:id="@android:id/list"更改为android:id="@+id/list"

@+id - 当您将自己的id设置为应用程序命名空间中的listView时,会使用此方法。

@android:id - 当您将视图的id设置为预定义的android命名空间时使用。

同时将android.R.id.list替换为R.id.list

答案 2 :(得分:0)

将代码更改为

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/no_players_found"
        android:textSize="25sp" />

</LinearLayout>

在活动中声明如下:

ListView listView = (ListView) findViewById(R.id.list);
TextView textView = (TextView) findViewById(R.id.empty);

答案 3 :(得分:0)

试试这个,

public class PlayerManagement extends AppCompatActivity {
    private Cursor c;
    private SQLiteDatabase db;
    private String selectedPlayerId, selectedPlayerName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_player_management);
        ListView listView = (ListView) findViewById(android.R.id.list);

        try {
            MTGPS_DBHelper dbHelper = new MTGPS_DBHelper(this);
            db = dbHelper.getWritableDatabase();
            new getPlayersCursorAsync().execute();

            final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(PlayerManagement.this, android.R.layout.simple_list_item_1, c,
                                       new String[]{MTGPS_DB_Contract.Player.COLUMN_NAME_PLAYER_NAME},
                                       new int[]{android.R.id.text1}, 0);
        if(mAdapter!=null)
        {
            listView.setAdapter(mAdapter);
        }   
...

答案 4 :(得分:0)

将listView ID android:id="@android:id/list" 更改为 android:id="@+id/list"

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />