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

标签 java android firebase firebase-realtime-database

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

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

对象包含 lampTitle、lampDesc、lampType。

enter image description here 在 firebase 存储中,我有 3 个图像应该显示在 Recycler View 中的每个对象下。 每个图像都应该与他的对象相匹配。 例如。 air_conditioning.png 应带有 AirCondition 对象等...

enter image description here 那就是我现在拥有的:

My LightsFragment - 包含回收者 View :

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 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;
    }

}

灯光呈现器和 View :

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

            }
        });
    }

}

我得到的结果:

enter image description here

最佳答案

不需要匹配什么,你应该简单地存储每个对象下的图像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显示它。

关于java - 如何将图像从存储链接到实时数据库(Firebase),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692459/

相关文章:

firebase - 如何使用 Firebase Cloud Firestore 创建 M-Pesa 回调 URL?

android - 如何使用 Node.js FCM 将通知发送到特定包名称

java - boolean if 语句

java - 流畅的语法和继承

java - SQlite android中的多个表

firebase - 在哪里可以找到 auth.token 数据,在 firebase 对象中

java - @PropertyMapping注解@DataJpaTest、@AutoConfigureTestDatabase不能与@Component注解@Configuration结合使用

java - 如何验证 Java 线程堆栈大小是固定的还是受限的?

java - 使用java代码配置创建管理MongoDb连接的Jpa EntityManager

php - Mysql 排序规则编码