为此,我使用Firebase作为数据库,使用Picasso在屏幕上加载图像。登录后,我无法看到每个类别的图像和名称。
我使用了一个带有setter和getter的模型名称“Category”,但这些消息一直出现在我的logcat上:
我的模型目前看起来像这样:
public class Category {
private String name, image;
public Category() {
}
public Category(String name, String image) {
this.name = name;
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
}
这是我的数据库示例。它显示了类别图像链接及其名称。
类别列表应该显示在片段中。这是我的片段类。
public class CategoryFragment extends Fragment {
View myFragment;
RecyclerView categoryList;
RecyclerView.LayoutManager layoutManager;
FirebaseRecyclerAdapter<Category, CategoryViewHolder> adapter;
// Firebase Tings
FirebaseDatabase database;
DatabaseReference categories;
public static CategoryFragment newInstance() {
CategoryFragment categoryFragment = new CategoryFragment();
return categoryFragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
database = FirebaseDatabase.getInstance();
categories = database.getReference("Category");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
myFragment = inflater.inflate(R.layout.fragment_category, container, false);
categoryList = (RecyclerView) myFragment.findViewById(R.id.categoryList);
categoryList.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(container.getContext());
categoryList.setLayoutManager(layoutManager);
loadCategories();
return myFragment;
}
private void loadCategories() {
adapter = new FirebaseRecyclerAdapter<Category, CategoryViewHolder>(
Category.class,
R.layout.category_item,
CategoryViewHolder.class,
categories
) {
@Override
protected void populateViewHolder(CategoryViewHolder viewHolder, final Category model, int position) {
viewHolder.tvCategoryName.setText(model.getName());
Picasso.with(getActivity())
.load(model.getImage())
.into(viewHolder.ivCategoryImage);
viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(getActivity(), String.format("%s | %s", adapter.getRef(position).getKey(), model.getName()), Toast.LENGTH_SHORT).show();
}
});
}
};
adapter.notifyDataSetChanged();
categoryList.setAdapter(adapter);
}
}
这是我的CategoryViewHolder类
public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView tvCategoryName;
public ImageView ivCategoryImage;
private ItemClickListener itemClickListener;
public CategoryViewHolder(View itemView) {
super(itemView);
ivCategoryImage = (ImageView) itemView.findViewById(R.id.ivCategoryImage);
tvCategoryName = (TextView) itemView.findViewById(R.id.tvCategoryName);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view, getAdapterPosition(), false);
}
}
我已经寻找不同的解决方案查看类别图像和名称,但没有运气。
更新 我已更新了database to this structure
我尝试使用这两种方式在设备上显示数据
categories=FirebaseDatabase.getInstance().getReference().child("Category");
/*database = FirebaseDatabase.getInstance();
categories = database.getReference("Category");*/
但仍然没有成功。
相反,它会显示the same errors。我没有以任何方式改变我的模型
感谢您的帮助。
P.S感谢前面提到的解决方案,太糟糕了它确实有效。任何更多帮助就足够了。
答案 0 :(得分:0)
您链接中的数据库结构似乎是这样的
category
|-category
|01
-------name
-------image
您应该参考第二个类别节点才能访问您的数据 但你好像不这样做。
所以不要使用这两行代码
database = FirebaseDatabase.getInstance();
categories = database.getReference("Category");
尝试使用此
DatabaseReference categories;
//and refer to your database like that
categories=FirebaseDatabase.getInstance().getReference().child("Category").child("Category");
根据您添加的链接,这应该是引用您的数据库的正确方法
答案 1 :(得分:0)
您当前的数据库结构嵌套在download.click()
节点下的Category
个对象,但您用于/Category/Category
的引用指向父FirebaseRecyclerAdapter
节点。 / p>
这导致了日志中的错误 - /Category
正试图将FirebaseRecyclerAdapter
节点的子节点封送到/Category
类中,但是没有匹配的直接子节点位置。
要解决此问题,您可以调整Category
正在使用的参考:
FirebaseRecyclerAdapter
或者,更改数据库结构,以便将类别列为@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
database = FirebaseDatabase.getInstance();
categories = database.getReference("Category").child("Category");
}
节点的直接子节点:
/Category