【问题标题】:RecyclerView Null Pointer Exception. Attempt to invoke virtual method RecyclerView.setLayoutManager on a null object referenceRecyclerView 空指针异常。尝试在空对象引用上调用虚拟方法 RecyclerView.setLayoutManager
【发布时间】:2025-11-22 21:25:01
【问题描述】:

我认为问题在于RecyclerView (transactions_list_view) 对象之一未包含在activity_main.xml 中,而是嵌套在另一个RecyclerView (groups_list_view) 中。两者都包含在下面。

错误:

03-22 22:04:51.433 15921-15921/com.example.android.myapplication E/AndroidRuntime: 致命异常: main 进程:com.example.android.myapplication,PID:15921 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.android.myapplication/com.example.android.myapplication.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.support.v7.空对象引用上的 widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2442) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2502) 在 android.app.ActivityThread.access$900(ActivityThread.java:167) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1361) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5469) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:770) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:660) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' 在 com.example.android.myapplication.MainActivity.onCreate(MainActivity.java:37) 在 android.app.Activity.performCreate(Activity.java:6553) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2502) 在 android.app.ActivityThread.access$900(ActivityThread.java:167) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1361) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5469) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:770) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:660)

MainActivity.java

package com.example.android.myapplication;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import com.example.android.myapplication.data.GroupsContract;
import com.example.android.myapplication.data.GroupsDbHelper;
import com.example.android.myapplication.data.TestUtilGroups;
import com.example.android.myapplication.data.TestUtilTransaction;
import com.example.android.myapplication.data.TransactionsContract;
import com.example.android.myapplication.data.TransactionsDbHelper;

public class MainActivity extends AppCompatActivity {

    private GroupsListAdapter mGroupsAdapter;
    private TransactionsListAdapter mTransactionsAdapter;

    private SQLiteDatabase mGroupsDb;
    private SQLiteDatabase mTransactionsDb;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView groupsRecyclerView;
        RecyclerView transactionsRecyclerView;

        groupsRecyclerView = (RecyclerView) this.findViewById(R.id.all_groups_list_view);
        transactionsRecyclerView = (RecyclerView) this.findViewById(R.id.transactions_list_view);

        groupsRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        transactionsRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        GroupsDbHelper groupsDbHelper = new GroupsDbHelper(this);
        TransactionsDbHelper transactionsDbHelper = new TransactionsDbHelper(this);

        mGroupsDb = groupsDbHelper.getWritableDatabase();
        mTransactionsDb = transactionsDbHelper.getWritableDatabase();

        TestUtilGroups.insertFakeData(mGroupsDb);
        TestUtilTransaction.insertFakeData(mTransactionsDb);

        Cursor cursorGroups = getAllGroups();
        Cursor cursorTransactions = getAllTransactions();

        mGroupsAdapter = new GroupsListAdapter(this, cursorGroups);
        mTransactionsAdapter = new TransactionsListAdapter(transactionsRecyclerView.getContext(), cursorTransactions);

        groupsRecyclerView.setAdapter(mGroupsAdapter);
        transactionsRecyclerView.setAdapter(mTransactionsAdapter);

    }

    private Cursor getAllGroups() {
        return mGroupsDb.query(
                GroupsContract.GroupsEntry.TABLE_NAME,
                null,
                null,
                null,
                null,
                null,
                GroupsContract.GroupsEntry._ID
        );
    }

    private Cursor getAllTransactions() {
        return mTransactionsDb.query(
                TransactionsContract.TransactionsEntry.TABLE_NAME,
                null,
                null,
                null,
                null,
                null,
                TransactionsContract.TransactionsEntry._ID
        );
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.android.myapplication.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/all_groups_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
</FrameLayout>

TransactionsListAdapter.java

package com.example.android.myapplication;

import android.content.Context;
import android.database.Cursor;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.android.myapplication.data.GroupsContract;
import com.example.android.myapplication.data.TransactionsContract;

/**
 * Created by max on 3/22/2017.
 */

public class TransactionsListAdapter extends RecyclerView.Adapter<TransactionsListAdapter.TransactionsViewHolder> {

    private Context mContext;
    private Cursor mCursor;

    public TransactionsListAdapter(Context context, Cursor cursor) {
        this.mContext = context;
        this.mCursor = cursor;
    }

    @Override
    public TransactionsListAdapter.TransactionsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.transactions_list_item, parent, false);
        return new TransactionsViewHolder(view);
    }

    @Override
    public void onBindViewHolder(TransactionsListAdapter.TransactionsViewHolder holder, int position) {
        if(!mCursor.moveToPosition(position))
            return;
        String transactionName = mCursor.getString(mCursor.getColumnIndex(TransactionsContract.TransactionsEntry.COLUMN_NAME));
        String transactionAmount = mCursor.getString(mCursor.getColumnIndex(TransactionsContract.TransactionsEntry.COLUMN_AMOUNT));
        String transactiongivenortaken = mCursor.getString(mCursor.getColumnIndex(TransactionsContract.TransactionsEntry.COLUMN_GIVEN_TAKEN));

        holder.transactionNameTextView.setText(transactionName);
        holder.transactionAmountTextView.setText(transactionAmount);
        holder.transactionGivenortakenTextView.setText(transactiongivenortaken);
    }

    @Override
    public int getItemCount() {
        return mCursor.getCount();
    }

    class TransactionsViewHolder extends RecyclerView.ViewHolder{

        TextView transactionNameTextView;
        TextView transactionAmountTextView;
        TextView transactionGivenortakenTextView;

        public TransactionsViewHolder(View itemView){
            super(itemView);
            transactionNameTextView = (TextView) itemView.findViewById(R.id.transactions_list_name);
            transactionAmountTextView = (TextView) itemView.findViewById(R.id.transactions_list_amount);
            transactionGivenortakenTextView = (TextView) itemView.findViewById(R.id.transactions_list_givenortaken);
        }
    }
}

groups_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:layout_margin="16dp"
    android:background="#fff"
    android:elevation="4dp">

    <TextView
        android:id="@+id/group_name_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="3sp"
        android:text="Group_Name"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/group_type_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Group_Type"
        android:textSize="20sp"
        android:layout_margin="3sp"
        android:layout_alignBaseline="@id/group_name_text_view"
        android:layout_alignBottom="@+id/view"
        android:layout_alignParentEnd="true"
        android:textColor="@color/secondary_text"/>

    <View
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginLeft="2sp"
        android:layout_marginRight="2sp"
        android:background="@color/divider"
        android:layout_alignBottom="@+id/group_name_text_view"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/transactions_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignTop="@+id/view">
    </android.support.v7.widget.RecyclerView>

</RelativeLayout>

transactions_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="3sp">
    <TextView
        android:id="@+id/transactions_list_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp"/>
    <TextView
        android:id="@+id/transactions_list_amount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp"/>
    <TextView
        android:id="@+id/transactions_list_givenortaken"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="10sp"/>
</LinearLayout>

【问题讨论】:

    标签: android android-layout android-recyclerview android-adapter


    【解决方案1】:

    在您的 actvity_main.xml 文件中没有任何 ID transactions_list_view

    【讨论】:

      【解决方案2】:

      编辑你的activity_main文件如下-

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
      >
          <android.support.v7.widget.RecyclerView
              android:id="@+id/all_groups_list_view"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
          </android.support.v7.widget.RecyclerView>
      
          <android.support.v7.widget.RecyclerView
              android:id="@+id/transactions_list_view"
              android:layout_marginTop="20dp"
              android:layout_below="@+id/all_groups_list_view"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">
          </android.support.v7.widget.RecyclerView>
      
      </RelativeLayout>
      

      【讨论】:

      • 是的,我知道这会起作用,但这不是我想要的显示方式。我想要另一个布局文件中的 RecyclerView。
      最近更新 更多