回收者视图?没有连接适配器;跳过片段中的布局

Mru*_*nal 2 android android-fragments firebase-realtime-database

我一直在阅读 StackOverflow 上的不同答案并尝试实施他们的解决方案,但我仍然收到错误消息:RecyclerView?没有连接适配器;跳过布局,

所以我在我的片段中的 onCreateView 中初始化我的回收器视图,如下所示:

public class StatusFragment extends Fragment {

   DatabaseReference databaseStatus;
   ProgressDialog progressDialog;
   List<ElectricityClass> list = new ArrayList<ElectricityClass>();
   RecyclerView recyclerView;
   RecyclerView.Adapter adapter;

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

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

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View rootView = inflater.inflate(R.layout.fragment_status, container, false);

    recyclerView = rootView.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);

    progressDialog = new ProgressDialog(getActivity());
    progressDialog.setMessage("Loading Data from Firebase Database");
    progressDialog.show();

    databaseStatus = FirebaseDatabase.getInstance().getReference().child("Electricity");
    databaseStatus.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot snapshot) {

            for (DataSnapshot dataSnapshot : snapshot.getChildren()) {

              ElectricityClass electricityClass = dataSnapshot.getValue(ElectricityClass.class);
                list.add(electricityClass);
            }
            recyclerView.setLayoutManager(new LinearLayoutManager(getContext().getApplicationContext()));
            adapter = new RecyclerViewAdapter(getContext().getApplicationContext(), list);
            recyclerView.setAdapter(adapter);
            progressDialog.dismiss();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            progressDialog.dismiss();
        }
    });

    return  rootView;
}
}
Run Code Online (Sandbox Code Playgroud)

我的 RecyclerViewAdapter 类:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

Context context;
List<ElectricityClass> dataList;



public RecyclerViewAdapter(Context context, List<ElectricityClass> list) {

    this.dataList = list;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_items, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    return viewHolder;
}

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

    ElectricityClass studentDetails = dataList.get(position);
    holder.StudentNameTextView.setText(studentDetails.getName());
    holder.StudentNumberTextView.setText(studentDetails.getType());
}


@Override
public int getItemCount() {

    return dataList.size();
}

class ViewHolder extends RecyclerView.ViewHolder {

    public TextView StudentNameTextView;
    public TextView StudentNumberTextView;

    public ViewHolder(View itemView) {

        super(itemView);
        StudentNameTextView = itemView.findViewById(R.id.ShowStudentNameTextView);
        StudentNumberTextView = itemView.findViewById(R.id.ShowStudentNumberTextView);
    }
}
Run Code Online (Sandbox Code Playgroud)

}

我的清单电力类:

   class ElectricityClass {


private String id;
private String email;
private String name;
private String type;
private String detail;
private String location;
private String date;
private String imgurl;

public ElectricityClass() {

    // Required empty public constructor
}


public ElectricityClass(String id, String currentUserString, String imageUrl, String nameString, String typeString, String detailString, String locationString, String dateString){

    this.id = id;
    this.email = currentUserString;
    this.name =nameString;
    this.type = typeString;
    this.detail = detailString;
    this.location = locationString;
    this.date = dateString;
    this.imgurl = imageUrl;
}

public String getImgurl() {
    return imgurl;
}

public void setImgurl(String imgurl) {
    this.imgurl = imgurl;
}

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public String getDetail() {
    return detail;
}

public void setDetail(String detail) {
    this.detail = detail;
}

public String getLocation() {
    return location;
}

public void setLocation(String location) {
    this.location = location;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}
Run Code Online (Sandbox Code Playgroud)

}

这是我在片段中的布局:

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/recyclerView"
    android:layout_alignParentTop="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
</android.support.v7.widget.RecyclerView>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

和一个项目的布局:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardview1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    card_view:cardElevation="5dp"
    card_view:contentPadding="5dp"
    card_view:cardCornerRadius="5dp"
    card_view:cardMaxElevation="5dp">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ECEFF1"
        android:padding="10dp">

        <TextView
            android:id="@+id/StudentName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Student Name: "
            android:textColor="#000"
            android:textSize="20dp" />

        <TextView
            android:id="@+id/ShowStudentNameTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Show Student Name"
            android:textColor="#000"
            android:textSize="20dp"
            android:layout_alignParentTop="true"
            android:layout_toRightOf="@+id/StudentName"
            android:layout_toEndOf="@+id/StudentName"
            android:layout_marginLeft="19dp"
            android:layout_marginStart="19dp" />

        <TextView
            android:id="@+id/StudentNumber"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Phone Number: "
            android:textColor="#000"
            android:textSize="20dp"
            android:layout_below="@+id/StudentName"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <TextView
            android:id="@+id/ShowStudentNumberTextView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Show Number"
            android:textColor="#000"
            android:textSize="20dp"
            android:layout_marginLeft="11dp"
            android:layout_marginStart="11dp"
            android:layout_below="@+id/ShowStudentNameTextView"
            android:layout_toRightOf="@+id/StudentNumber"
            android:layout_toEndOf="@+id/StudentNumber" />

    </RelativeLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

现在它显示,

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged()' on a null object reference
Run Code Online (Sandbox Code Playgroud)

在这里我定义我的 List2

  public class StatusFragment extends Fragment {

DatabaseReference databaseStatus;
ProgressDialog progressDialog;
List<ElectricityClass> list2 = new ArrayList<ElectricityClass>();
List<ElectricityClass> list = new ArrayList<ElectricityClass>();
RecyclerView recyclerView;
RecyclerView.Adapter adapter;
Run Code Online (Sandbox Code Playgroud)

在 onDataChanged() 里面,

   public void onDataChange(DataSnapshot snapshot) {

            for (DataSnapshot dataSnapshot : snapshot.getChildren()) {

                ElectricityClass electricityClass = dataSnapshot.getValue(ElectricityClass.class);
                list2.add(electricityClass);
            }
            refreshRv((ArrayList<ElectricityClass>) list2);
            adapter = new RecyclerViewAdapter(getContext().getApplicationContext(), list);
            recyclerView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            progressDialog.dismiss();
        }

        private void refreshRv(ArrayList<ElectricityClass> list2){
            list.clear();
            list.addAll(list2);
        }
Run Code Online (Sandbox Code Playgroud)

Ion*_*jan 5

您在该onDataChange方法中执行此错误的设置布局和适配器。而是创建一个私有函数来实例化您的适配器,将其设置为RecyclerView并将设置布局管理器。(您可能也想define从适配器的构造函数中获取列表list = new ArrayList<>();

完成此函数后,onCreateView在片段的方法中调用它,然后在内部onDataChange调用一个刷新函数(也是私有的),它将清除您的列表(或不取决于您的行为),添加所有新值并使用通知您的适配器adapter.notifyDataSetChanged()方法。

希望能帮到你 :)

编辑:正如有人在评论中提到的,您的错误只是告诉您适配器未设置为RecyclerView,可能是因为onDataChanged()未调用。我上面的解释肯定会解决问题

编辑: 定义另一个列表比方说list2,替换list.add();list2.add();内部的从onDataSetChanged();

然后在for之后,调用这个函数

private void refreshRv(ArrayList<YourDataType> list2){
    list.clear();
    list.addAll(list2);
    adapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

  • 你没有正确地`实例化`你的适配器..它是空的,这意味着`adapter = new RecyclerViewAdapter();`在`adapter.notifyDataSetChanged();`之后被调用 (2认同)