【发布时间】:2021-03-25 22:07:58
【问题描述】:
当我尝试打开应用程序的这一部分时,它会自动在模拟器中使应用程序崩溃并抛出此错误:
E/AndroidRuntime: 致命异常: main 进程:com.amazonaws.ivs.player.scrollablefeed,PID:7317 java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.recyclerview.widget.RecyclerView.setHasFixedSize(boolean)” 在 com.amazonaws.ivs.player.scrollablefeed.activities.BookingStep1Fragment.initView(BookingStep1Fragment.java:95) 在 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
【问题讨论】:
-
recycler_view 为空
-
你永远不会分配 recycler_view。
-
@MichaelKrause EllisGC 正在使用 ButterKnife
-
谢谢大家@MichaelKrause 那么它需要在 onCreateView 中分配吗?
-
我明白了。那么,不应该在 onCreate 中调用 ButterKnife.bind(this) 吗?
标签: java android firebase android-recyclerview