RecyclerView:没有连接适配器;跳过片段中的布局

时间:2018-02-10 13:45:50

标签: android android-fragments firebase-realtime-database

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

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

{('a','g','r'): 1, ('a', 'r'): 2, ('p', 'q'):1}

我的RecyclerViewAdapter类:

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;
}
}

}

我的清单电力等级:

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);
    }
}

}

这是片段中的布局:

   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;
}

项目的布局:

 <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>

现在显示,

<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>

这里我定义了我的List2

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

并在onDataChanged()内部,

  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;

2 个答案:

答案 0 :(得分:3)

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

完成此功能后,在片段的onCreateView方法中调用它,在onDataChange内调用刷新功能(也是私有),清除列表(或不依赖于您的行为),添加所有新值并使用adapter.notifyDataSetChanged()方法通知您的适配器。

希望这会对你有所帮助:)。

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

<强> 编辑: 定义另一个列表,让我们说list2,将list.add();替换为list2.add();,其中onDataSetChanged();

之后,调用此函数

private void refreshRv(ArrayList<YourDataType> list2){
    list.clear();
    list.addAll(list2);
    adapter.notifyDataSetChanged();
}

答案 1 :(得分:0)

这对我有用 @felicity只需正确添加此功能

private void refreshRv(ArrayList<YourDataType> list2)
{
list.clear();
list.addAll(list2);
adapter.notifyDataSetChanged();
  }

作为lonut J.Bejan说的