当我放入Firebase的addChildEventListener时,以下代码 - > onChildAdded覆盖函数,正在工作,而不是myRecyclerViewAdapter.notifyDataSetChanged()
expendableRecyclerViewAdapter = new ExpendableRecyclerViewAdapter(listOfItems, getContext());
mExpandableRecyclerView.setAdapter(expendableRecyclerViewAdapter);
以下功能正常工作'没有连接适配器;跳过布局'错误正在logcat中显示这里有什么问题?任何帮助表示赞赏
private boolean getCurrentRestMenuList(){
DatabaseReference databaseReference = firebaseDatabase.getReference("menus").child(restID);
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
MenuModelForFirebase menuModel = dataSnapshot.getValue(MenuModelForFirebase.class);
MenuModel expandableMenuModel = new MenuModel(menuModel.getMenuTitle(), menuModel.getFoodModelList());
listOfMenus.add(expandableMenuModel);
expendableRecyclerViewAdapter = new ExpendableRecyclerViewAdapter(listOfMenus, getContext());
mExpandableRecyclerView.setAdapter(expendableRecyclerViewAdapter);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return listOfMenus.isEmpty();
}
在firebase的addchildeventlistener中调用RecyclerViewAdapter.notifyDataSetChanged()的错误 - > onChildAdded
01-04 06:48:31.907 30495-30495/com.example.aliy.bisp_client_side E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.aliy.bisp_client_side, PID: 30495
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at com.thoughtbot.expandablerecyclerview.models.ExpandableList.numberOfVisibleItemsInGroup(ExpandableList.java:37)
at com.thoughtbot.expandablerecyclerview.models.ExpandableList.getVisibleItemCount(ExpandableList.java:50)
at com.thoughtbot.expandablerecyclerview.ExpandableRecyclerViewAdapter.getItemCount(ExpandableRecyclerViewAdapter.java:93)
Firebase的菜单型号
public class MenuModelForFirebase {
private String MenuTitle;
private List<FoodModel> foodModelList;
public MenuModelForFirebase(){}
public MenuModelForFirebase(String menuTitle, List<FoodModel> foodModelList) {
MenuTitle = menuTitle;
this.foodModelList = foodModelList;
}
public String getMenuTitle() {
return MenuTitle;
}
public void setMenuTitle(String menuTitle) {
MenuTitle = menuTitle;
}
public List<FoodModel> getFoodModelList() {
return foodModelList;
}
public void setFoodModelList(List<FoodModel> foodModelList) {
this.foodModelList = foodModelList;
}
}
食物模型
package com.example.aliy.bisp_client_side.Models;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Created by Aliy on 12/31/2017.
*/
public class FoodModel implements Parcelable {
private String fId;
private String fName;
private int fPrice;
private String fDescription;
private String fCuisineType;
private String fFoodImage;
public FoodModel(String fId, String fName, int fPrice, String description, String fCuisineType, String fFoodImage) {
this.fId = fId;
this.fName = fName;
this.fPrice = fPrice;
this.fDescription = description;
this.fCuisineType = fCuisineType;
this.fFoodImage = fFoodImage;
}
public FoodModel() {
}
protected FoodModel(Parcel in) {
fId = in.readString();
fName = in.readString();
fPrice = in.readInt();
fDescription = in.readString();
fCuisineType = in.readString();
fFoodImage = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(fId);
parcel.writeString(fName);
parcel.writeInt(fPrice);
parcel.writeString(fDescription);
parcel.writeString(fCuisineType);
parcel.writeString(fFoodImage);
}
public static final Creator<FoodModel> CREATOR = new Creator<FoodModel>() {
@Override
public FoodModel createFromParcel(Parcel in) {
return new FoodModel(in);
}
@Override
public FoodModel[] newArray(int size) {
return new FoodModel[size];
}
};
public String getfId() {
return fId;
}
public String getfName() {
return fName;
}
public int getfPrice() {
return fPrice;
}
public String getfDescription() {
return fDescription;
}
public String getfCuisineType() {
return fCuisineType;
}
public String getfFoodImage() {
return fFoodImage;
}
public void setfFoodImage(String fFoodImage) {
this.fFoodImage = fFoodImage;
}
public void setfCuisineType(String fCuisineType) {
this.fCuisineType = fCuisineType;
}
public void setfId(String fId) {
this.fId = fId;
}
public void setfName(String fName) {
this.fName = fName;
}
public void setfPrice(int fPrice) {
this.fPrice = fPrice;
}
public void setfDescription(String fDescription) {
this.fDescription = fDescription;
}
}
可扩展回收站视图的菜单模型
public class MenuModel extends ExpandableGroup<FoodModel> {
public MenuModel(String title, List<FoodModel> items) {
super(title, items);
}
}
具有可扩展回收站视图的片段
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_restaurant__menu, container, false);
SetRestID();
//Set visible Brand Icon and Restaurant Imageview layouts
((Home_Screen)getActivity()).showImageviewAndBrandIcon();
//region TITLE INIT
collapsingToolbarLayout = (CollapsingToolbarLayout) getActivity().findViewById(R.id.collapsingToolbarLayout);
//endregion
//region CHANGE TITLE TEXTVIEW COLORS
collapsingToolbarLayout.setCollapsedTitleTextColor(getResources().getColor(R.color.PALETTE_AMBER));
collapsingToolbarLayout.setExpandedTitleColor(getResources().getColor(R.color.white));
//endregion
//region APP BAR LAYOUT WITH SETTING BEHAVIOUR TO BRAND ICON
appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.main_home_page_app_bar_layout);
appBarLayout.addOnOffsetChangedListener(this);
//endregion
//region BRAND ICON LAYOUT INIT
brand_icon = (LinearLayout) getActivity().findViewById(R.id.brand_icon);
YoYo.with(Techniques.ZoomInUp).duration(2000).playOn(brand_icon);
//endregion
//region FIREBASE INITIALIZING
firebaseDatabase = FirebaseDatabase.getInstance();
//endregion
//region SETTING UP IMAGEVIEWS and Textviews
SetupLayout(view);
//endregion
//region GET RESTAURANT DATA FROM DB
getCurrentRestaurantInfo();
//endregion
//region CONTENT PART -- RETRIEVING RESTAURANTS MENUS FROM DB
mExpandableRecyclerView = view.findViewById(R.id.expandable_recycler_menu);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
layoutManager.setAutoMeasureEnabled(true);
mExpandableRecyclerView.setLayoutManager(layoutManager);
listOfMenus= new ArrayList<>();
mExpandableRecyclerView.setNestedScrollingEnabled(false);
getCurrentRestMenuList();
//endregion
//region SETUP DEFAULT IMAGES TO SCREEN
setupImageViewToDefaultImages();
//endregion
return view;
}
答案 0 :(得分:0)
你应该在这里理解两件事,
ChildEventListener是异步的。根据您从childeventlistener中检索到的值,您无法在函数中返回true
或false
。
每次更新recyclerview的数据集时,都不必附加适配器的新对象。
以下是我建议的更改:
List<MenuModel> listOfMenus = new ArrayList();
expendableRecyclerViewAdapter = new ExpendableRecyclerViewAdapter(listOfMenus, getContext());
mExpandableRecyclerView.setAdapter(expendableRecyclerViewAdapter);
private void getCurrentRestMenuList(){
listOfMenus.clear();
DatabaseReference databaseReference = firebaseDatabase.getReference("menus").child(restID);
databaseReference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
MenuModelForFirebase menuModel = dataSnapshot.getValue(MenuModelForFirebase.class);
MenuModel expandableMenuModel = new MenuModel(menuModel.getMenuTitle(), menuModel.getFoodModelList());
listOfMenus.add(expandableMenuModel);
expendableRecyclerViewAdapter.notifyDataSetChanged();// This will notify the adapter to reload the values for update the recyclerview.
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//return listOfMenus.isEmpty();It might always return false because childeventlistener is an async. call. I don't see the use of this.
}
如果您有特定用例,请将其添加到问题中。