但是图片无法加载,几秒钟后应用就崩溃了。下面是这个项目的完整编码。我是安卓开发的新手,我想我应该从做项目开始学习。我不明白我的编码有什么问题。
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;
}
}
你正在传递一个空列表给 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) {
}
});