android - 如何使用 recyclerview 显示图像
问题描述
我正在关注本教程,了解如何从 Firebase 存储中检索上传的图像以显示在 recyclerview 中。但是当我运行我的应用程序时,我看不到上传的图像,而是我的应用程序崩溃了,并且错误一直指向包含此代码的特定行,ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);
但它并没有真正解释为什么它是错误的。我不确定有人可以请...非常请帮助我我一直在寻找这个一周的答案,但没有得到任何答案。谢谢提前
错误:
FATAL EXCEPTION: main
Process: com.myapp.Gogo, PID: 22974
com.google.firebase.database.DatabaseException: Found two getters or fields
with conflicting case sensitivity for property: imageurl
2020-03-05 11:06:36.238 22974-22974/com.myapp.Gogo
E/RecyclerView: No adapter attached; skipping layout
适配器类:
public class AdapterOne extends RecyclerView.Adapter<AdapterOne.ViewHolder> {
Context context;
List <ImageUploadInfo> ImageUploadInfoList;
public AdapterOne(Context c, List<ImageUploadInfo> TempList){
this.ImageUploadInfoList=TempList;
this.context=c;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview,parent,false);
ViewHolder viewHolder=new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ImageUploadInfo imageUploadInfo=ImageUploadInfoList.get(position);
//loading image with glide libary
Glide.with(context).load(imageUploadInfo.getImageUrl()).into(holder.imageView);
}
@Override
public int getItemCount() {
return ImageUploadInfoList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView=(ImageView) itemView.findViewById(R.id.imageview);
}
}
}
图片上传.类:
public class ImageUploadInfo {
public String imageURL;
public ImageUploadInfo( String url) {
//this.imageName = name;
this.imageURL= url;
}
public String getImageUrl() {
return null;
}
}
这是主页:
if(firebaseUser!=null) {
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("Users");
DatabaseReference uidRef = rootRef.child("images").child(uid);
uidRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
ImageUploadInfo imageUploadInfo = postSnapshot.getValue(ImageUploadInfo.class);
list.add(imageUploadInfo);
}
adapter1 = new AdapterOne(getApplicationContext(), list);
recyclerView.setAdapter(adapter1);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
解决方案
像这样更改您的模型类,看看这是否适合您。将其标记为私有使得 firebase 只能找到 getter/setter 并在命名时尝试遵守 Java 的 camelCase 约定。
public class ImageUploadInfo {
private String imageUrl; // main change is this should be private
private ImageUploadInfo() {} // default constructor that takes no arguments
public ImageUploadInfo(String imageUrl) {
this.imageUrl= imageUrl;
}
public String getImageUrl() {
return imageUrl; // and why are you returning null here
}
}
对于适配器问题。您需要从 MainThread 设置它,因此,从您的onDataChange
方法中移动行
adapter1 = new AdapterOne(getApplicationContext(), list);
recyclerView.setAdapter(adapter1);
adapter1.notifyDataSetChanged;
到onCreate()
您的活动的方法,并在onDataChange
添加到list = new ArrayList<>();
仅使用初始化的列表之后
adapter1.notifyDataSetChanged
让我知道这是否能够解决您的问题。
推荐阅读
- php - 如何修复 Visual Studio Code 中的以下 phpcs 错误?
- vue.js - Vuex-map-fields 通过模块更新多个 store
- r - 如何标准化面板数据框中的选定列
- spring - Eclipselink / Spring Boot 与 Gradle。为 QueryDslPredicateExecutor 获取 ClassNotFoundException
- python - 使用 Python Plotly 自定义 Networkx 图(或 Scatter)
- ios - SKSpriteNode 使用 PDF/SVG 矢量图像进行自动缩放
- django - 我怎样才能在 django 上使 Emailfield 不区分大小写?
- android - transformClassesAndResourcesWithProguardForRelease
- visual-studio-code - 如何关闭 vscode 的搜索开关?
- python - 在 PyQt 中不能调用 QThread