【问题标题】:How to link image from storage to real time database (Firebase)如何将图像从存储链接到实时数据库(Firebase)
【发布时间】:2020-02-29 17:05:49
【问题描述】:

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

我的应用中有 RecyclerView,其中包含 Firebase 数据库中的所有对象。

对象包含lampTitle、lampDesc、lampType。

在 Firebase 存储中,我有 3 张图像应该显示在 Recycler 视图中的每个对象下。 每个图像都应与他的对象匹配。 例如。 air_conditioning.png 应该与 AirCondition 对象等...

这就是我现在所拥有的:

我的 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);
    }

LightsAdapter:

public class LightsAdapter extends RecyclerView.Adapter<LightsAdapter.LightsViewHolder> {

    private Context context;
    private ArrayList<Light> lights;

    public LightsAdapter(Context context, ArrayList<Light> lights) {
        this.context = context;
        this.lights = lights;
    }

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

    @Override
    public void onBindViewHolder(@NonNull LightsViewHolder holder, int position) {
        final Light light = lights.get(position);
        holder.TVlightTitle.setText(light.getLampTitle());
        holder.TVLightDesc.setText(light.getLampDesc());
        holder.TVLightType.setText(String.valueOf(light.getLampType()));
    }

    @Override
    public int getItemCount() {
        return lights.size();
    }

    public class LightsViewHolder extends RecyclerView.ViewHolder {

        private TextView TVlightTitle;
        private TextView TVLightDesc;
        private TextView TVLightType;
        private ImageView IVLightImage;

        public LightsViewHolder(@NonNull View itemView) {
            super(itemView);
            TVlightTitle = itemView.findViewById(R.id.lightTitle);
            TVLightDesc = itemView.findViewById(R.id.lightDesc);
            TVLightType = itemView.findViewById(R.id.lightType);
            IVLightImage = itemView.findViewById(R.id.lightImage);
        }
    }

灯光类:

public class Light {

    private int lampType;
    private String lampTitle;
    private String lampDesc;

    public Light(String lampDesc, String lampTitle, int lampType) {
        this.lampType = lampType;
        this.lampTitle = lampTitle;
        this.lampDesc = lampDesc;
    }

    public Light() {
    }

    public int getLampType() {
        return lampType;
    }

    public void setLampType(int lampType) {
        this.lampType = lampType;
    }

    public String getLampTitle() {
        return lampTitle;
    }

    public void setLampTitle(String lampTitle) {
        this.lampTitle = lampTitle;
    }

    public String getLampDesc() {
        return lampDesc;
    }

    public void setLampDesc(String lampDesc) {
        this.lampDesc = lampDesc;
    }

}

灯光演示者和视图:

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 ");

            }
        });
    }

}

这就是我的结果:

【问题讨论】:

  • 显示您的图片上传和数据库插入代码。如果您手动上传图像,则必须在实时数据库中传递存储位置
  • 嗨@Ashish,我已手动将图像上传到 storage ,并添加了实时数据库的路径。我尝试在适配器中使用 glide 来加载 URL。 public void onBindViewHolder(@NonNull LightsViewHolder holder, int position) { final Light light = lights.get(position);持有人.TVlightTitle.setText(light.getLampTitle()); holder.TVLightDesc.setText(light.getLampDesc()); holder.TVLightType.setText(String.valueOf(light.getLampType())); Glide.with(context) .load(light.getLampImageUrl()) .into(holder.IVLightImage); } 还是不行
  • 嗨,迈克尔,您已经在这里发布了这个问题:stackoverflow.com/questions/58647082/…,它已关闭。一般来说,编辑原始问题以便创建重新投票比创建副本更好。

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。我已将 glide 添加到grade.app 并尝试做类似的事情。在我的适配器中,在 onBindView 下我添加了:' public void onBindViewHolder(@NonNull LightsViewHolder holder, int position) { final Light light = lights.get(position);持有人.TVlightTitle.setText(light.getLampTitle()); holder.TVLightDesc.setText(light.getLampDesc()); holder.TVLightType.setText(String.valueOf(light.getLampType())); Glide.with(context) .load(light.getLampImageUrl()) .into(holder.IVLightImage); }'
  • 但它仍然没有显示图像。在调试时,我看到了存储 url。
  • 听起来你应该问另一个问题来解释在 Glide 的情况下什么不按你期望的方式工作。也添加自己的MCVE,这样我和其他Firebase开发者可以帮助到你。
猜你喜欢
  • 2021-07-12
  • 2018-02-04
  • 2018-08-23
  • 1970-01-01
  • 2020-08-09
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多