我正在使用recyclerview从Firebase加载图片。

问题描述 投票:0回答:1

但是图片无法加载,几秒钟后应用就崩溃了。下面是这个项目的完整编码。我是安卓开发的新手,我想我应该从做项目开始学习。我不明白我的编码有什么问题。

RecyclerAdapter代码

package com.example.wallpaper;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.util.List;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ImageVieHolder> {
    private Context mCtx;
    private List<Images> imagesList;

    public RecyclerAdapter(Context mCtx, List<Images> imagesList) {
        this.mCtx = mCtx;
        this.imagesList = imagesList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ImageVieHolder holder, int position) {
        Images im=imagesList.get(position);
        Glide.with(mCtx).load(im.url).into(holder.imageView);
}

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

    public class ImageVieHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        public ImageVieHolder(@NonNull View itemView) {
            super(itemView);
            imageView=itemView.findViewById(R.id.image_view);

        }
    }
}

MainActivity.java代码

package com.example.wallpaper;

import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private List<Images> imagesList;
    private RecyclerView recyclerView;
    private DatabaseReference db;
    private RecyclerAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=findViewById(R.id.recycler);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new GridLayoutManager(this,3));
        imagesList =new ArrayList<>();
        adapter=new RecyclerAdapter(this,imagesList);
        recyclerView.setAdapter(adapter);
        String category = "S10";
        db= FirebaseDatabase.getInstance().getReference("images").child(category);
        db.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot post:dataSnapshot.getChildren()){
                    Images im =post.getValue(Images.class);
                    imagesList.add(im);
                }

                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    }

Images.java代码

package com.example.wallpaper;

public class Images {
    String url;

    public Images(String url) {
        this.url = url;
    }
}
java android firebase android-studio firebase-realtime-database
1个回答
1
投票

你正在传递一个空列表给 adapter所以当从空列表中访问一个项目时,它就会抛出异常。

请修改你的代码如下:-

    db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot post:dataSnapshot.getChildren()){
                Images im =post.getValue(Images.class);
                imagesList.add(im);
            }

             adapter=new RecyclerAdapter(this,imagesList);
             recyclerView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.