有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将两个子数据检索到recyclerview?

我在大学里做一个Android项目。我有一个像这样的Firebase实时数据库

Firebase

我有一个recyclerview,它有两个孩子的数据:泵和传感器(土壤湿度)。通常,它看起来像这样(在一张卡片中):

TextView(id:传感器)(传感器名称->;SOILMOISURE) TextView(id:水分)(来自传感器的水分->;土壤水分)
Textview(id:泵)(泵名称)
文本视图(id:auto)(从泵自动)

(这不是不同类型的视图,它只是一个cardview,但需要来自两个子视图的数据)。 但我只能从Firebase检索到适配器的一个子级。我只能一次显示泵名称、自动(或传感器)

这是我的密码:

活动泵。java

package com.example.gardbot;

import 安卓.os.Bundle;
import 安卓x.appcompat.app.AppCompatActivity;
import 安卓x.recyclerview.widget.LinearLayoutManager;
import 安卓x.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.FirebaseDatabase;

public class ActivityPump extends AppCompatActivity {
    RecyclerView recview;
    myAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_controlpump);
        recview=(RecyclerView)findViewById(R.id.recview);
        recview.setLayoutManager(new LinearLayoutManager(this));

        FirebaseRecyclerOptions<model> options = new FirebaseRecyclerOptions.Builder<model>()
                        .setQuery(FirebaseDatabase.getInstance().getReference().child("pump"), model.class).build();

        adapter= new myAdapter(options);
        recview.setAdapter(adapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }

}

模型。java

package com.example.gardbot;

public class model {
    String name,auto,waterLevel;

    model()
    {
    }

    public model(String name, String auto, String waterLevel) {
        this.name = name;
        this.auto = auto;
        this.waterLevel=waterLevel;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuto() {
        return auto;
    }

    public void setAuto(String auto) {
        this.auto = auto;
    }

    public String getWaterLevel() {
        return waterLevel;
    }

    public void setWaterLevel(String waterLevel) {
        this.waterLevel = waterLevel;
    }

}

myAdapter。java

package com.example.gardbot;

import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.CheckBox;
import 安卓.widget.LinearLayout;
import 安卓.widget.TextView;

import 安卓x.annotation.NonNull;
import 安卓x.appcompat.widget.SwitchCompat;
import 安卓x.recyclerview.widget.RecyclerView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;

import org.jetbrains.annotations.NotNull;

public class myAdapter extends FirebaseRecyclerAdapter<model,myAdapter.myviewholder> {

    public myAdapter(@NonNull @NotNull FirebaseRecyclerOptions<model> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull @NotNull myviewholder holder, int position, @NonNull @NotNull model model) {
        holder.pump.setText(model.getName());
        holder.pump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (holder.pump.isChecked())
                {
                    holder.linear.setVisibility(View.VISIBLE);
                }
                else
                {
                    holder.linear.setVisibility(View.GONE);
                }
            }
        });
        {

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


    class myviewholder extends RecyclerView.ViewHolder
    {
        CheckBox pump;
        LinearLayout linear;
        SwitchCompat switchstate;
        public myviewholder(@NonNull @NotNull View itemView) {
            super(itemView);
            pump=(CheckBox)itemView.findViewById(R.id.pump);
            linear=(LinearLayout)itemView.findViewById(R.id.info);
            switchstate=(SwitchCompat)itemView.findViewById(R.id.switchstate);
        }
    }

}

我如何从传感器(Firebase)到recyclerview(连同泵)获取数据?(在一个recyclerview中显示来自2个子项的两个数据)


共 (2) 个答案

  1. # 1 楼答案

    您正在使用FirebaseUI库中的适配器。此库中的所有适配器都构建为仅显示数据库中单个路径下的节点。因此,它们既可以显示sensor的子节点,也可以显示pump的子节点,但不能在单个列表中同时显示两个节点的子节点

    您必须更改数据结构以获得单一的节点平面列表,或者必须创建自己的适配器

  2. # 2 楼答案

    您可以使用ValueEventListener并过滤泵数据,直到找到与sensor匹配的pump

    为此,需要输入此代码(但需要设置传感器id,例如:将“s0001”改为“0001”):

    FirebaseDatabase.getInstance().getReference("pump").child("p" + model.getSensorId()).addValueEventListener(new ValueEventListener() {
       @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String waterLevel = dataSnapshot.child("waterLevel").getValue().toString();
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
     
        }
    });
    

    并向模型中添加一个变量:

    String sensorId;

    然后将以下内容添加到传感器数据:sensorId