簡體   English   中英

Null 帶有片段的指針異常 - 嘗試調用虛擬方法 'void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)'

[英]Null Pointer Exception with Fragment - Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)'

當我嘗試打開應用程序的這一部分時,它會自動使模擬器中的應用程序崩潰並拋出此錯誤:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.amazonaws.ivs.player.scrollablefeed, PID: 7317 java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)' on a null object reference at com.amazonaws.ivs.player.scrollablefeed.activities.BookingStep1Fragment.initView(BookingStep1Fragment.java:95) at com.amazonaws.ivs.player.scrollablefeed.activities.BookingStep1Fragment.onCreateView(BookingStep1Fragment.java:88)

當我嘗試將 recyclerView 設置為破壞它但不確定如何修復的固定大小時,似乎是 InitView 方法。 任何幫助都會很棒,因為這是我最后一年的項目,截止日期迫在眉睫-謝謝!

BookingStep1Fragment.Java code

package com.amazonaws.ivs.player.scrollablefeed.activities;

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.amazonaws.ivs.player.scrollablefeed.R;
import com.amazonaws.ivs.player.scrollablefeed.activities.adapters.MyCityAdapter;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import com.jaredrummler.materialspinner.MaterialSpinner;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import dmax.dialog.SpotsDialog;

import static android.app.Dialog.*;


public class BookingStep1Fragment extends Fragment implements CityLoadListener, BranchLoadListener {

    CollectionReference cityRef;
    CollectionReference branchRef;

    CityLoadListener cityLoadListener;
    BranchLoadListener branchLoadListener;


    @BindView(R.id.spinner)
    MaterialSpinner bSpinner;
    @BindView(R.id.recycler_view)
    RecyclerView recycler_view;

    Unbinder unbinder;

    AlertDialog dialog;


   static BookingStep1Fragment instance;

   public static BookingStep1Fragment getInstance() {
       if(instance == null)
           instance = new BookingStep1Fragment();
       return instance;
   }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        cityRef = FirebaseFirestore.getInstance().collection("City");
        cityLoadListener = this;
        branchLoadListener = this;

        AlertDialog dialog = new SpotsDialog.Builder().setContext(getActivity()).build();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);

        View itemView = inflater.inflate(R.layout.fragment_booking_one, container, false);
        unbinder = ButterKnife.bind(this,itemView);

        initView();
        loadAllCity();
        
        return itemView;
    }

    private void initView() {
       recycler_view.setHasFixedSize(true);
       recycler_view.setLayoutManager(new GridLayoutManager(getActivity(), 2));
       recycler_view.addItemDecoration(new SpacesItemDecoration(4));
    }

    private void loadAllCity() {
       cityRef.get()
               .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                   @Override
                   public void onComplete(@NonNull Task<QuerySnapshot> task) {
                       if(task.isSuccessful())
                       {
                           List<String> list = new ArrayList<>();
                           list.add("Please choose city");
                           for(QueryDocumentSnapshot documentSnapshot: task.getResult())
                               list.add(documentSnapshot.getId());
                           cityLoadListener.onCityLoadSuccess(list);
                       }
                   }
               }).addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               cityLoadListener.onCityLoadFailed(e.getMessage());

           }
       });

    }

    @Override
    public void onCityLoadSuccess(List<String> areaNameList) {
       bSpinner.setItems(areaNameList);
       bSpinner.setOnItemSelectedListener((view, position, id, item) -> {
           if(position > 0)
           {
               loadBranchOfCity(item.toString());
           }
           else
               recycler_view.setVisibility(View.GONE);
       });

    }

    private void loadBranchOfCity(String cityName) {
       dialog.show();

       branchRef = FirebaseFirestore.getInstance()
               .collection("City")
               .document(cityName)
               .collection("Branch");

       branchRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
           @Override
           public void onComplete(@NonNull Task<QuerySnapshot> task) {
               List<City> list = new ArrayList<>();
               if(task.isSuccessful())
               {
                   for(QueryDocumentSnapshot documentSnapshot: Objects.requireNonNull(task.getResult()))
                       list.add(documentSnapshot.toObject(City.class));
                   branchLoadListener.onBranchLoadSuccess(list);
               }
           }
       }).addOnFailureListener(new OnFailureListener() {
           @Override
           public void onFailure(@NonNull Exception e) {
               branchLoadListener.onBranchLoadFailed(e.getMessage());

           }
       });

    }

    @Override
    public void onCityLoadFailed(String message) {
        Toast.makeText(getActivity(),message, Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onBranchLoadSuccess(List<City> cityList) {
        MyCityAdapter adapter = new MyCityAdapter(getActivity(),cityList);
        recycler_view.setAdapter(adapter);
        recycler_view.setVisibility(View.VISIBLE);

        dialog.dismiss();

    }

    @Override
    public void onBranchLoadFailed(String message) {
        Toast.makeText(getActivity(),message, Toast.LENGTH_SHORT).show();
        dialog.dismiss();


    }
}

code

fragment_booking_one.xml

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

<com.jaredrummler.materialspinner.MaterialSpinner
    android:id="@+id/spinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_marginTop="4dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

code

界面

package com.amazonaws.ivs.player.scrollablefeed.activities;

import java.util.List;

public interface CityLoadListener {
    void onCityLoadSuccess(List<String> areaNameList);
    void onCityLoadFailed(String message);
}

code

BookingActivity.Java

package com.amazonaws.ivs.player.scrollablefeed.activities;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;
import android.widget.Button;

import com.amazonaws.ivs.player.scrollablefeed.R;
import com.amazonaws.ivs.player.scrollablefeed.activities.adapters.MyViewPagerAdapter;
import com.shuhart.stepview.StepView;

import java.util.ArrayList;
import java.util.List;

import butterknife.ButterKnife;

public class BookingActivity extends AppCompatActivity {

    StepView bStepView;
    ViewPager bViewPager;
    Button btn_prev, btn_next;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_booking);
        ButterKnife.bind(BookingActivity.this);

        bStepView = findViewById(R.id.step_view);
        bViewPager = findViewById(R.id.view_pager);
        btn_prev = findViewById(R.id.btn_previous_step);
        btn_next = findViewById(R.id.btn_next_step);

        setupStepView();
        setColourButton();

        // View
        bViewPager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
        bViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (position == 0)
                    btn_prev.setEnabled(false);
                else
                    btn_prev.setEnabled(true);

                setColourButton();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    private void setColourButton() {
        if(btn_next.isEnabled())
        {
            btn_next.setBackgroundResource(R.color.colorBlack);
        }
        else
        {
            btn_next.setBackgroundResource(android.R.color.darker_gray);
        }
        if(btn_prev.isEnabled())
        {
            btn_prev.setBackgroundResource(R.color.colorBlack);
        }
        else
        {
            btn_prev.setBackgroundResource(android.R.color.darker_gray);
        }
    }

    private void setupStepView() {
        List<String> stepList = new ArrayList<>();
        stepList.add("City");
        stepList.add("Event");
        stepList.add("Time");
        stepList.add("Confirm");
        bStepView.setSteps(stepList);

    }
}

code

確保您在應用程序 gradle 中添加了此annotationProcessor

annotationProcessor 'com.jakewharton:butterknife-compiler:latest_version'

你沒有初始化元素嗎?

recycler_view = findViewById(R.id.recycler_view)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM