【问题标题】:Get random data android firebase database in RecyclerView在 RecyclerView 中获取随机数据 android firebase 数据库
【发布时间】:2017-11-07 23:37:42
【问题描述】:

Firebase 数据库

在 child("AdUsersINFO") 我有一个孩子的用户 (userid) 在这个孩子我们有一个帖子。

我的目标是随机发布一个帖子并将数据显示在RecyclerView

目前,我在onCreateView, 上有此代码,但它没有获取任何数据:

recycle = (RecyclerView) view.findViewById(R.id.recycle);
        mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO");
        mAdUserDatabse.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                int ads = (int) dataSnapshot.getChildrenCount();
                int rand = new Random().nextInt(ads);
                Iterator itr = dataSnapshot.getChildren().iterator();

                for (int i = 0; i < rand; i++) {
                    list = new ArrayList<Adver>();
                    Adver value = dataSnapshot.getValue(Adver.class);
                    Adver fire = new Adver();
                    String type = value.getType();
                    String categories = value.getCategories();
                    String city = value.getCity();
                    fire.setType(type);
                    fire.setCategories(categories);
                    fire.setCity(city);
                    list.add(fire);

                    itr.next();
                }
                RecyclerAdapter recyclerAdapter = new RecyclerAdapter(list, getContext());
                final RecyclerView.LayoutManager recyce = new GridLayoutManager(getContext(), 2);
                recycle.setLayoutManager(recyce);
                recycle.setItemAnimator(new DefaultItemAnimator());
                recycle.setAdapter(recyclerAdapter);
            }

            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
                Log.w("Failed to read value.", error.toException());
            }
        });

这是我的适配器类

CardAdapter 类

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.MyHoder> {

    List<Adver> list;
    Context context;

    public CardAdapter(List<Adver> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public MyHoder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(context).inflate(R.layout.card, parent, false);
        return new MyHoder(view);
    }

    @Override
    public void onBindViewHolder(MyHoder holder, int position) {
        Adver mylist = list.get(position);
        holder.type.setText(mylist.getType());
        holder.categories.setText(mylist.getCategories());
        holder.city.setText(mylist.getCity());
        holder.availability.setText(mylist.getAvailability());
        holder.cost.setText(mylist.getCost());

    }

    @Override
    public int getItemCount() {
        int arr = 0;
        try {
            if (list.size() == 0) {
                arr = 0;
            } else {
                arr = list.size();
            }
        } catch (Exception e) {

        }
        return arr;
    }

    class MyHoder extends RecyclerView.ViewHolder {
        TextView type, categories, city, availability, cost;
        ImageView img;

        public MyHoder(View itemView) {
            super(itemView);
            type = (TextView) itemView.findViewById(R.id.vType);
            categories = (TextView) itemView.findViewById(R.id.vCategories);
            city = (TextView) itemView.findViewById(R.id.vCity);
            availability = (TextView) itemView.findViewById(R.id.vAvailability);
            cost = (TextView) itemView.findViewById(R.id.vPrice);

        }
    }
}

【问题讨论】:

  • 第一个用户下只有一个帖子,是你想要的吗?
  • 不,这只是为了显示帖子中的数据
  • for 循环中使用这个list = new ArrayList&lt;Adver&gt;();,您将在每次迭代中创建一个新列表!基本上只在您的列表中添加一个条目。这就是你想要的吗?
  • @Barns52 我想在每次迭代中获取不同的帖子数据
  • @Mu'athAbuKhurma 日志中写了什么?

标签: java android firebase firebase-realtime-database


【解决方案1】:

您的DatabaseReference 错误。您需要更改这行代码:

mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO");

mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO").child(uid);

其中uid是登录用户的用户ID。要获取uid,请使用这行代码:

String uid = FirebaseUser.getInstance().getCurrentUser().getUid();

对于您的代码,当您使用 getChildren() 方法进行迭代时,您会像我理解的那样遍历用户而不是帖子。

【讨论】:

  • 我想从任何 uid 获取随机帖子,而不是用户登录的 uid
  • 这种情况下需要迭代两次。一次用于获取用户,第二次用于获取随机帖子。
【解决方案2】:
mAdUserDatabse = FirebaseDatabase.getInstance().getReference().child("AdUsersINFO");
mAdUserDatabse.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        int ads = (int) dataSnapshot.getChildrenCount();
        int rand = new Random().nextInt(ads);
        for(DataSnapshot data: dataSnapshot.getChildren()){
        for(DataSnapshot datas: data.getChildren()){
        for(int i = 0; i < rand; i++) {

        list = new ArrayList<Adver>();

            Adver value = datas.getValue(Adver.class);
            Adver fire = new Adver();
            String type = value.getType();
            String categories = value.getCategories();
            String city = value.getCity();
            fire.setType(type);
            fire.setCategories(categories);
            fire.setCity(city);
            list.add(fire);

}}}}

【讨论】:

  • 它给了我最后一个用户的最后一篇文章
  • 帖子的内容?
  • 是的,因为您没有在代码中获取所有内容
  • 它让我得到了城市和类型,但没有得到类别
  • 总是只给你最后一个用户的帖子吗?
猜你喜欢
  • 2017-06-21
  • 2017-07-06
  • 2014-06-30
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
相关资源
最近更新 更多