如何在屏幕上显示类别的图像和名称

时间:2017-11-02 10:16:19

标签: android firebase firebase-realtime-database android-recyclerview firebaseui

为此,我使用Firebase作为数据库,使用Picasso在屏幕上加载图像。登录后,我无法看到每个类别的图像和名称。

我使用了一个带有setter和getter的模型名称“Category”,但这些消息一直出现在我的logcat上:

screenshot

我的模型目前看起来像这样:

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

这是我的数据库示例。它显示了类别图像链接及其名称。

database structure

类别列表应该显示在片段中。这是我的片段类。

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感谢前面提到的解决方案,太糟糕了它确实有效。

任何更多帮助就足够了。

2 个答案:

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