【问题标题】:Android RecyclerView NullPointerExceptionAndroid RecyclerView NullPointerException
【发布时间】:2018-09-27 02:05:15
【问题描述】:

目前我正在做一个项目,我需要在其中实施 RecyclerView/CardView。从 MainActivity 我在一个开关盒中调用片段,所有片段都在其中工作。每当我按下 Fragment CardViewTabelFragment(在模拟器中)时,我就会崩溃并得到 NullPointerException。 MainActivity 中的一切都在工作。我希望我对我的问题的描述符合您的期望,如果不是,那么我可以详细说明和/或附加更多代码。也感谢您提供反馈,以便下次我在这里发布问题时更加完整。

这是我在 MainActivity 中调用的片段:

public class CardViewTabelFragment extends Fragment {


private RecyclerView recyclerView;
private RecyclerAdapter adapter;

public CardViewTabelFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate( R.layout.fragment_card_view_tabel, container, false );

    recyclerView = (RecyclerView) view.findViewById( R.id.recycler_view );

    adapter = new RecyclerAdapter();

    recyclerView.setAdapter( adapter );

    final RecyclerView.LayoutManager layoutManager = new LinearLayoutManager( getActivity() );

    ((LinearLayoutManager) layoutManager).setOrientation( LinearLayoutManager.VERTICAL );

    recyclerView.setLayoutManager( layoutManager ) ;

    return view;

  }

}

新的 RecyclerAdapter();延伸到另一个java类,代码如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

public static String[] title = new String[] {"Sensor 1", "Sensor 2"};

public static String[] beskrivelse = new String[] {"Temperatur & Humdity Sensorer", "Light Sensorer"};


@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from( parent.getContext() ).inflate( R.layout.fragment_card_view_tabel, parent, false );
    return new RecyclerViewHolder( view );
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    ((RecyclerViewHolder) holder).bindView( position );

}

@Override
public int getItemCount() {
    return title.length;
}

private class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView mBeskrivelse;
    private TextView mTitle;

    public RecyclerViewHolder(View itemView) {
        super( itemView );

        mBeskrivelse = (TextView) itemView.findViewById( R.id.item_beskrivelse );
        mTitle = (TextView) itemView.findViewById( R.id.item_title );
        itemView.setOnClickListener( this );


    }

    @Override
    public void onClick(View v) {

    }

    public void bindView(int position) {

        mBeskrivelse.setText( beskrivelse[position] );
        mTitle.setText( title[position] );

    }

  }

}

` 我的 LogCat 如下,你可以清楚地看到,异常发生在

recyclerView.setAdapter(适配器);

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.yusuf.cxweb, PID: 31207
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setAdapter(android.support.v7.widget.RecyclerView$Adapter)' on a null object reference
    at com.example.yusuf.cxweb.CardViewTabelFragment.onCreateView(CardViewTabelFragment.java:39)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2229)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

* 更新 *

片段卡片视图表的 XML 文件

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

    <android.support.v7.widget.CardView
        android:id="@+id/card_container1"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:layout_margin="16dp"
        app:cardBackgroundColor="@color/colorGrass"
        app:cardCornerRadius="4dp"
        app:cardElevation="8dp">

        <TextView
            android:id="@+id/item_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textStyle="bold"
            android:layout_gravity="center"
            android:textColor="@color/colorWhite"
            android:text="Sensor 1"
            android:textAppearance="@style/TextAppearance.AppCompat.Large" />

        <TextView
            android:id="@+id/item_beskrivelse"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="30dp"
            android:text="Sensor 1"
            android:textAppearance="@style/TextAppearance.AppCompat.Large"
            android:textColor="@color/colorWhite"
            android:textSize="14sp" />
    </android.support.v7.widget.CardView>


</LinearLayout>

* 上次更新 *

为了完成这项工作,我必须将充气机中的布局 -> 从“fragment_card_view_table”更改为“card_list”,这是我拥有的另一个 xml 文件,recyclerview 位于其中。非常感谢“TheWanderer”谁为我指明了正确的方向!

【问题讨论】:

  • layout.fragment_card_view_tabel.xml 中有什么内容?
  • 刚刚更新并附加到问题中。感谢您的回答。
  • 您的问题中没有 XML。
  • 抱歉,出了点问题。现在已经上传了:)
  • 你在那个 XML 中没有 RecyclerView。

标签: android android-fragments android-recyclerview


【解决方案1】:

onCreateView() 中,只有视图才会发生膨胀。

onViewCreatedMethod() 中初始化您的 RecyclerView。

编辑:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate( R.layout.fragment_card_view_tabel, container, false );
return view;
}




@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
recyclerView = (RecyclerView) view.findViewById( R.id.recycler_view );

    adapter = new RecyclerAdapter();

    recyclerView.setAdapter( adapter );

    final RecyclerView.LayoutManager layoutManager = new LinearLayoutManager( getActivity() );

    ((LinearLayoutManager) layoutManager).setOrientation( LinearLayoutManager.VERTICAL );

    recyclerView.setLayoutManager( layoutManager ) ;
}

【讨论】:

  • 这不能解决问题。您可以在onCreateView() 中进行查看逻辑。
  • 刚试过,可惜没用。不过谢谢,我很感激你的努力!
  • xml中没有RecyclerView
【解决方案2】:

您使用了错误的布局 XML。您正在充气的那个没有 RecyclerView 。确保你正在膨胀实际包含你想要的 RecyclerView 的布局。

【讨论】:

    【解决方案3】:

    这两行

    // Inflate the layout for this fragment
        View view = inflater.inflate( R.layout.fragment_card_view_tabel, container, false );
    
        recyclerView = (RecyclerView) view.findViewById( R.id.recycler_view );
    

    首先你在膨胀 xml,然后在第二行你说在那个 xml 中找到 recyclerview。

    当然会抛出 NPE。

    您需要在 xml 中添加 RecyclerView 并为其指定 ID recycler_view

    【讨论】:

      【解决方案4】:

      正如异常状态,setAdapter() 获得空指针异常。我认为您在初始化 List 或 ArrayList 时犯了错误。一般来说,您需要在 RecyclerAdapter 构造函数中传递 List 或 ArrayList。但是您已经以静态方式完成了它。另外我不确定你是否覆盖了这个方法

         // total number of rows
          @Override
          public int getItemCount() {
              return yourDataArrayOrList.size();
          }
      

      请参阅此link。如果可能,请尝试根据此结构更改您的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-11
        • 1970-01-01
        • 2021-04-10
        • 2016-11-20
        • 2015-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多