【问题标题】:How can i fill the recylerview with firebase realtime database data?如何用 firebase 实时数据库数据填充 recyclerview?
【发布时间】:2019-09-26 16:33:13
【问题描述】:

我为此尝试了很多解决方案,但没有一个能解决我的问题。我无法使用 recyclerview 访问数据库。我有这样的 firebase 实时数据库数据;

标签 --- 主要类别 ----- 密钥ID ------ 主类,子类

标签类

public class Tags {
    private String id;
    private String mainTags;
    private String subTags;

    public Tags() {}

    public Tags(String id, String mainTags, String subTags) {
        this.id = id;
        this.mainTags = mainTags;
        this.subTags = subTags;
    }

    public String getId() {
        return id;
    }

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

    public String getMainTags() {
        return mainTags;
    }

    public void setMainTags(String mainTags) {
        this.mainTags = mainTags;
    }

    public String getSubTags() {
        return subTags;
    }

    public void setSubTags(String subTags) {
        this.subTags = subTags;
    }
}


这是 TagAdapter

public class TagAdapter extends RecyclerView.Adapter<TagAdapter.ItemViewHolder> {

    private List<Tags> mTagList;
    private Context mContext;

    public TagAdapter(List<Tags> mTagList, Context mContext) {
        this.mTagList = mTagList;
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.each_item_tags, parent,false);
        return new ItemViewHolder(view);
    }

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


        Tags tags = mTagList.get(position);
        holder.tvTags.setText(tags.getSubTags());
        holder.tvMainTags.setText(tags.getMainTags());

    }

    @Override
    public int getItemCount() {
        return mTagList.size();
    }


    public class ItemViewHolder extends RecyclerView.ViewHolder{

        private TextView tvMainTags, tvTags;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            tvMainTags = itemView.findViewById(R.id.tvMainTag);
            tvTags = itemView.findViewById(R.id.tvTags);
        }
    }
}

标签片段

  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_tags, container, false);
        rvTags = view.findViewById(R.id.rvTags);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        rvTags.setLayoutManager(linearLayoutManager);
        rvTags.hasFixedSize();

        tagAdapter = new TagAdapter(tagsList, getContext());
        rvTags.setAdapter(tagAdapter);


        return view;
    }

private void getTagView(){
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference dbRefTags = firebaseDatabase.getReference().child("Tag");

        dbRefTags.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                for (DataSnapshot ds : dataSnapshot.getChildren()){
                    if (ds.exists()) {
                        try {
                            Tags tags = ds.getValue(Tags.class);
                            tagsList.add(tags);
                        }catch (Exception e){
                            Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                        }

                    }else {
                        Toast.makeText(getContext(), "Bir hata oluştu", Toast.LENGTH_SHORT).show();
                    }
                }

                tagAdapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

}


运行时没有出现错误,但我无法检索数据。我也尝试了 firebaseRecyclerView.Adapter 并且在最后一个依赖项中,我无法使其工作。我不知道这里出了什么问题。我该如何解决这个问题?

【问题讨论】:

  • 添加您的 Firebase 数据库结构的屏幕截图
  • 一个在这里。 imgur
  • 另一个在这里imgur
  • 首先,您的标签模型类与数据库结构不匹配。其次,您只应该在添加新孩子时获取数据。
  • 我也试过 addValueListener 但同样的事情发生了。我应该如何制作数据结构?

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


【解决方案1】:

获取子名ds.child("SubTag").getValue()的数据

  dbRefTags.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for (DataSnapshot parentDS : dataSnapshot.getChildren()) {
                        Log.d("Tag:", String.valueOf(parentDS.getKey()));
                        for (DataSnapshot ds : parentDS.getChildren()) {
                            Tags tags = new Tags();
                            tags.setMainTag(parentDS.getKey());
                            tags.setSubTag(ds.child("SubTag").getValue().toString());
                            Log.d("Tag: -> SubTag)", tags.getSubTag());
                            tagsList.add(tags);
                        }
                    }
                    tagAdapter.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(getContext(), databaseError.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 2023-03-27
    • 2020-06-06
    • 2020-05-28
    • 1970-01-01
    • 2019-04-18
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多