Java 如何将图像从存储器链接到实时数据库(Firebase)

Java 如何将图像从存储器链接到实时数据库(Firebase),java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个关于如何从实时数据库将图像链接到每个对象的问题 我的应用程序中有RecyclerView,它包含Firebase数据库中的所有对象 对象包含lampTitle、lampDesc、lampType 在firebase存储中,我有3个图像,它们应该显示在回收器视图中的每个对象下。 每个图像都应该与其对象匹配。 例如air_condition.png应带有空调对象等 这就是我现在所拥有的: 我的LightsFragment-包含回收器视图: public class LightsFragm

我有一个关于如何从实时数据库将图像链接到每个对象的问题

我的应用程序中有RecyclerView,它包含Firebase数据库中的所有对象

对象包含lampTitle、lampDesc、lampType

在firebase存储中,我有3个图像,它们应该显示在回收器视图中的每个对象下。 每个图像都应该与其对象匹配。 例如air_condition.png应带有空调对象等

这就是我现在所拥有的:

我的LightsFragment-包含回收器视图:

public class LightsFragment extends Fragment implements LightsPresenter {

    private RecyclerView RVLights;
    private ArrayList<Light> lights = new ArrayList<>();
    private Light light;
    private LightsAdapter lightsAdapter;
    private LightsView presenter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_lights, container, false);
        presenter = new LightsView(lights, light, this);
        RVLights = view.findViewById(R.id.RVLights);
        presenter.loadData();
        return view;
    }

    @Override
    public void setAdapter() {
        lightsAdapter = new LightsAdapter(getActivity(), lights);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        RVLights.setLayoutManager(layoutManager);
        RVLights.setAdapter(lightsAdapter);
    }
灯光演示器和视图:

public interface LightsPresenter {

    void setAdapter();

}

public class LightsView {

    private ArrayList<Light> lights = new ArrayList<>();
    private Light light;
    private FirebaseDatabase db;
    private DatabaseReference allLights;
    private LightsPresenter lightsPresenter;

    public LightsView(ArrayList<Light> lights, Light light, LightsPresenter lightsPresenter) {
        this.lights = lights;
        this.light = light;
        this.lightsPresenter = lightsPresenter;
    }

    public void loadData() {
        db = FirebaseDatabase.getInstance();
        allLights = db.getReference("AllLights");

        allLights.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                    light = dataSnapshot1.getValue(Light.class);
                    lights.add(light);
                    Log.i("LightsDataLoaded", "true " + light.getLampTitle());
                }
                lightsPresenter.setAdapter();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.i("LightsDataLoaded", "false ");

            }
        });
    }

}
公共接口灯重置中心{
void setAdapter();
}
公共级灯光视图{
private ArrayList lights=new ArrayList();
私家电灯;
私有FirebaseDB数据库;
私有数据库参考allLights;
私人照明中心照明中心;
公共灯光视图(阵列列表灯光、灯光、灯光中心灯光中心){
这个。灯=灯;
这个。光=光;
this.lightsPresenter=lightsPresenter;
}
公共void loadData(){
db=FirebaseDatabase.getInstance();
allLights=db.getReference(“allLights”);
allLights.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot dataSnapshot1:DataSnapshot.getChildren()){
light=dataSnapshot1.getValue(light.class);
灯光。添加(灯光);
Log.i(“LightsDataLoaded”,“true”+light.getLampTitle());
}
lightsPresenter.setAdapter();
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.i(“LightsDataLoaded”、“false”);
}
});
}
}
这就是我得到的结果:


无需匹配,只需将图像url存储在每个对象下即可:

Firebase-root
   |
   --- AllLights
          |
          --- AirBag
                |
                --- lampDesc: "Is it safe..."
                |
                --- lampTitle: "Air bag Lamp"
                |
                --- lampType: 1
                |
                --- lampImageUrl: "Firebase Storage Image Url" //New property added

正如您所看到的,我添加了一个新属性,它应该保存相应图像的url。最后,您可以简单地使用来显示它。

显示您的图像上载和数据库插入代码。如果手动上传图像,则必须通过实时数据库中的存储位置hi@Ashish,我将手动将图像上传到存储,并将路径添加到实时数据库。我尝试在适配器中使用glide加载URL。public void onBindViewHolder(@NonNull lights viewholder holder,int position){final Light Light=lights.get(position);holder.TVlightTitle.setText(Light.getlamptTitle());holder.TVLightDesc.setText(String.valueOf(Light.getLampType());Glide.with(context)。加载(Light.getLampImageUrl())。到(holder.IVLightImage);}仍然不起作用嗨,Michael,你已经在这里发布了这个问题:它已经关闭了。一般来说,编辑原始问题以便创建重新开放投票比创建副本更好。谢谢你的回答。我已经将glide添加到grade.app并尝试做类似的事情。在我的适配器中,在onBindView下,我添加了:'public void onBindViewHolder(@NonNull LightsViewHolder holder,int position){final Light Light=lights.get(position);holder.TVlightTitle.setText(Light.getlamptTitle());holder.TVLightDesc.setText(String.valueOf(Light.getLampType());Glide.with(context).load(light.getLampImageUrl())。加载到(holder.IVLightImage);}'但它仍然没有显示图像。在调试时,我看到了存储url。听起来你应该问另一个问题,解释在Glide的情况下,什么东西没有按预期的方式工作。另外添加它自己的,这样,我和其他Firebase开发人员可以帮你。
public interface LightsPresenter {

    void setAdapter();

}

public class LightsView {

    private ArrayList<Light> lights = new ArrayList<>();
    private Light light;
    private FirebaseDatabase db;
    private DatabaseReference allLights;
    private LightsPresenter lightsPresenter;

    public LightsView(ArrayList<Light> lights, Light light, LightsPresenter lightsPresenter) {
        this.lights = lights;
        this.light = light;
        this.lightsPresenter = lightsPresenter;
    }

    public void loadData() {
        db = FirebaseDatabase.getInstance();
        allLights = db.getReference("AllLights");

        allLights.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                    light = dataSnapshot1.getValue(Light.class);
                    lights.add(light);
                    Log.i("LightsDataLoaded", "true " + light.getLampTitle());
                }
                lightsPresenter.setAdapter();

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.i("LightsDataLoaded", "false ");

            }
        });
    }

}
Firebase-root
   |
   --- AllLights
          |
          --- AirBag
                |
                --- lampDesc: "Is it safe..."
                |
                --- lampTitle: "Air bag Lamp"
                |
                --- lampType: 1
                |
                --- lampImageUrl: "Firebase Storage Image Url" //New property added