android - 我如何用 firebase 实时数据库数据填充 recylerview?

标签 android firebase-realtime-database android-recyclerview

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

标签 --- 主分类 ----- key 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);
        }
    }
}

标签 fragment

  @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 并且在最后一个依赖项中,我无法使其工作。我不知道这里出了什么问题。我该如何解决这个问题?

最佳答案

获取带有子名称的数据 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();
                }
            });

关于android - 我如何用 firebase 实时数据库数据填充 recylerview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58121192/

相关文章:

android - 在 Android 的 VideoView 中播放视频

Java Firebase 按子值搜索

android - 强制使用 Android appcompat `SortedList` ?

android - 图像未使用 Rx Observable 和 Retrofit2 加载 Picasso

android - Kotlin RecyclerView 添加加载页脚

java - 使用 cordova 构建时 JAVA_HOME 无效

android - 将 html Assets 加载到 webview 时出现问题

ios - Firebase - 构建数据库的正确方法

firebase - 在 Firebase 数据库中存储用户的正确方法

android - ListView 中的按钮 - android