如何检索两个数据 child 到 recyclerview?
How to retrieve two data child to recyclerview?
我在大学里从事 Android 项目。我有一个像这样的 Firebase 实时数据库。
我有一个 recyclerview,它有来自两个 child 的数据:泵和传感器(soilMoisture)。一般来说,它看起来像这样(在一张卡片中):
TextView (id:sensor) (name from sensor->soilMoisture)
TextView (id:moisture) (来自传感器的水分-> soilMoisture)
Textview (id:pump) (来自泵的名称)
TextView (id:auto)(自动从泵)
(这不是不同类型的视图,它只是一个卡片视图,但需要来自两个 child 的数据)。
但我只能从 Firebase 检索一个 child 到我的适配器。我一次只能显示泵名称、自动(或传感器)。
这是我的代码:
ActivityPump.java
package com.example.gardbot;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.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();
}
}
model.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 android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SwitchCompat;
import androidx.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(连同泵)? (在一个回收站视图中显示来自 2 child 的两个数据)
您正在使用来自 FirebaseUI 库的适配器。该库中的所有适配器都被构建为仅显示数据库中单个路径下的节点。所以他们可以显示 sensor
的 children 或 pump
的 children,但他们不能显示 children 单个列表中的两个节点。
您要么必须更改您的数据结构以具有单个平面节点列表,要么必须创建您自己的适配器。
您可以使用 ValueEventListener
并过滤泵数据,直到找到匹配的 pump
和 sensor
为此,您需要输入此代码(但您需要设置传感器 ID,例如:输入“0001”而不是“s0001”):
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
我在大学里从事 Android 项目。我有一个像这样的 Firebase 实时数据库。
我有一个 recyclerview,它有来自两个 child 的数据:泵和传感器(soilMoisture)。一般来说,它看起来像这样(在一张卡片中):
TextView (id:sensor) (name from sensor->soilMoisture)
TextView (id:moisture) (来自传感器的水分-> soilMoisture)
Textview (id:pump) (来自泵的名称)
TextView (id:auto)(自动从泵)
(这不是不同类型的视图,它只是一个卡片视图,但需要来自两个 child 的数据)。 但我只能从 Firebase 检索一个 child 到我的适配器。我一次只能显示泵名称、自动(或传感器)。
这是我的代码:
ActivityPump.java
package com.example.gardbot;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.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();
}
}
model.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 android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SwitchCompat;
import androidx.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(连同泵)? (在一个回收站视图中显示来自 2 child 的两个数据)
您正在使用来自 FirebaseUI 库的适配器。该库中的所有适配器都被构建为仅显示数据库中单个路径下的节点。所以他们可以显示 sensor
的 children 或 pump
的 children,但他们不能显示 children 单个列表中的两个节点。
您要么必须更改您的数据结构以具有单个平面节点列表,要么必须创建您自己的适配器。
您可以使用 ValueEventListener
并过滤泵数据,直到找到匹配的 pump
和 sensor
为此,您需要输入此代码(但您需要设置传感器 ID,例如:输入“0001”而不是“s0001”):
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