【问题标题】:RecyclerView Nullpointer exceptionRecyclerView Nullpointer 异常
【发布时间】:2017-06-28 13:32:44
【问题描述】:

当我启动我的 RecyclerView 片段时,我有这个 NullPointer 异常,但我似乎无法找到为什么它没有存储在我的变量中。

这是我的完整代码:

public class LocationFragment extends Fragment {
    FragmentNameFactory nameFactory = new FragmentNameFactory();
    List<LocationData> locationData = new ArrayList<>();
    LocationRecyclerAdapter locationRecyclerAdapter = new LocationRecyclerAdapter(locationData);
    public LocationFragment(){
        //Fragment needs a constructor, can be empty
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        ((MainActivity) getActivity()).setFragmentName(nameFactory.getNameNL(6));
        View view = inflater.inflate(R.layout.flocation, container, false);
        locationData.add(new LocationData("a", "a", "a", "b", 4.55555, 3.39023, "e"));
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.locationRecyclerView);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(locationRecyclerAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(linearLayoutManager);
        locationRecyclerAdapter.notifyDataSetChanged();
        return view;
    }
    @Override
    public void onViewCreated(View view, Bundle savedInstance){
        super.onViewCreated(view, savedInstance);

    }
    @Override
    public void onActivityCreated(Bundle savedInstance){
        super.onActivityCreated(savedInstance);
    }
}

flocationRecycle.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <android.support.v7.widget.RecyclerView
            android:id="@+id/locationRecyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v7.widget.RecyclerView>
    </FrameLayout>
</RelativeLayout>

LocationRecyclerAdapter:

public class LocationRecyclerAdapter extends RecyclerView.Adapter<LocationRecyclerAdapter.LocationViewHolder> {
    List<LocationData> locationDataList;
    public class LocationViewHolder extends RecyclerView.ViewHolder {
        public CardView cardView;
        public TextView textViewName;
        public LocationViewHolder(View view) {
            super(view);
            cardView = (CardView) view.findViewById(R.id.card);
            textViewName = (TextView) view.findViewById(R.id.text_view_names);
        }
    }
    public LocationRecyclerAdapter(List<LocationData> locationsDataList){
        this.locationDataList = locationsDataList;
    }
    @Override
    public LocationViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.flocation, parent, false);
        LocationViewHolder locationViewHolder = new LocationViewHolder(view);
        return locationViewHolder;
    }

    @Override
    public void onBindViewHolder(LocationViewHolder holder, int position) {
        holder.textViewName.setText(locationDataList.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return locationDataList.size();
    }
}

flocation.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="120dp">
    <android.support.v7.widget.CardView
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="102dp">
            <TextView
                android:id="@+id/text_view_names"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_alignParentTop="true"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="10dp"></TextView>
        </RelativeLayout>
    </android.support.v7.widget.CardView>

</RelativeLayout>

代码在这一行崩溃:recyclerView.setHasFixedSize(true); 带有我上面所说的空指针,但我找不到 recyclerView 为空的原因

【问题讨论】:

  • 你不必调用 locationRecyclerAdapter.notifyDataSetChanged();如果适配器没有变化。

标签: java android nullpointerexception


【解决方案1】:

你膨胀了错误的布局,这样做:

View view = inflater.inflate(R.layout.flocationRecycle, container, false);

【讨论】:

    【解决方案2】:

    您正在膨胀的视图不包含您尝试引用的 RecyclerView。

    根据您提供的代码,您的 RecyclerView 是在 flocationRecycle.xml 中声明的,但您正在膨胀 flocation.xml

    View view = inflater.inflate(R.layout.flocation, container, false);
    

    flocation.xml 不包含任何 R.id.locationRecyclerView 子视图,因此当您尝试引用该 RecyclerView 时,您将得到空指针异常。

    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.locationRecyclerView); //there is no recycler view declared inside view
    

    【讨论】:

      【解决方案3】:

      我正在查看您的代码,发现您夸大了错误的 xml 文件。看到 flocationRecycle.xml 是正确的。

      这是你的 onCreate 实现:

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
          ((MainActivity) getActivity()).setFragmentName(nameFactory.getNameNL(6));
          View view = inflater.inflate(R.layout.flocation, container, false);
          locationData.add(new LocationData("a", "a", "a", "b", 4.55555, 3.39023, "e"));
          RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.locationRecyclerView);
          recyclerView.setHasFixedSize(true);
          recyclerView.setAdapter(locationRecyclerAdapter);
          LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
          recyclerView.setLayoutManager(linearLayoutManager);
          locationRecyclerAdapter.notifyDataSetChanged();
          return view;
      }
      

      请尝试这样做,如果还有其他问题,请告诉我。

      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
          ((MainActivity) getActivity()).setFragmentName(nameFactory.getNameNL(6));
          View view = inflater.inflate(R.layout.flocationRecycle, container, false);
          locationData.add(new LocationData("a", "a", "a", "b", 4.55555, 3.39023, "e"));
          RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.locationRecyclerView);
          LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
          recyclerView.setLayoutManager(linearLayoutManager);
          recyclerView.setHasFixedSize(true);
          recyclerView.setAdapter(locationRecyclerAdapter);
          return view;
      }
      

      我想知道您的适配器是否依赖于网络调用。在这种情况下,您必须创建一个 Listener,并在收到数据后调用 recyclerView.setAdapter()。

      【讨论】:

        【解决方案4】:

        您的 RecyclerView 为空,因为在您的搜索 ID (findViewById) 下的布局 XML 中找不到它。 我的猜测是,要么您指向错误的 XML,要么您使用错误的视图 ID 进行搜索。

        【讨论】:

          【解决方案5】:

          您的代码中有很多需要注意的地方:

          • RecyclerView.setLayoutManager() 应该在 RecyclerView.setAdapter() 之前调用
          • 拨打RecyclerView.setAdapter()时,无需再次拨打notifyDataSetChanged()
          • 这可能导致NullPointerException

            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.flocation, parent, false);
            

          因为您的ViewGroup 很难弄清楚上下文是什么,请尝试在RecyclerViewAdapter 中声明Context 字段。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多