java - 无法从Firebase Recycler Adapter android java中的模型检索数据数组项
问题描述
我在将其中一项具有 arrayList 类型的数据检索到 recyclerView 时遇到问题。以前,我已经询问并讨论了url_photo_collage
关于如何从 Firebase Realtime Database Java 中的子节点检索数组数据的正确模型?(Firebase Recycler Adapter)但问题是我的 recyclerview 没有显示任何内容。
这是我在这张图片中描述的结构数据库
我尝试过一些课程,之前的建议是这样的
在模型类中,我将数据类型更改url_photo_college
为 List
DolanItemClass.Java
package co.id.roningrum.firebasearrayimage;
import java.util.List;
public class DolanItemClass {
private String name_tourism;
private String location_tourism;
private String info_tourism;
private String telepon;
private String url_photo;
private List<String> url_photo_collage;
private double lat_location_tourism;
private double lng_location_tourism;
public DolanItemClass() {
//constructor untuk panggilan ke DataSnapshot.getValue
}
public DolanItemClass(String name_tourism, String location_tourism, String info_tourism, String telepon, String url_photo, List<String> url_photo_collage, double lat_location_tourism, double lng_location_tourism) {
this.name_tourism = name_tourism;
this.location_tourism = location_tourism;
this.info_tourism = info_tourism;
this.telepon = telepon;
this.url_photo = url_photo;
this.url_photo_collage = url_photo_collage;
this.lat_location_tourism = lat_location_tourism;
this.lng_location_tourism = lng_location_tourism;
}
public List<String> getUrl_photo_collage() {
return url_photo_collage;
}
public String getName_tourism() {
return name_tourism;
}
public void setName_tourism(String name_tourism) {
this.name_tourism = name_tourism;
}
public String getLocation_tourism() {
return location_tourism;
}
public void setLocation_tourism(String location_tourism) {
this.location_tourism = location_tourism;
}
public String getInfo_tourism() {
return info_tourism;
}
public void setInfo_tourism(String info_tourism) {
this.info_tourism = info_tourism;
}
public String getTelepon() {
return telepon;
}
public void setTelepon(String telepon) {
this.telepon = telepon;
}
public String getUrl_photo() {
return url_photo;
}
public void setUrl_photo(String url_photo) {
this.url_photo = url_photo;
}
public double getLat_location_tourism() {
return lat_location_tourism;
}
public void setLat_location_tourism(double lat_location_tourism) {
this.lat_location_tourism = lat_location_tourism;
}
public double getLng_location_tourism() {
return lng_location_tourism;
}
public void setLng_location_tourism(double lng_location_tourism) {
this.lng_location_tourism = lng_location_tourism;
}
}
由于在 DetailActivity 上显示 recyclerview,我创建了新的类视图,特别是 url_photo_college 项目
DolanImageViewHolder.class
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.List;
public class DolanImageViewHolder extends RecyclerView.ViewHolder {
private final ImageView imgDetailData;
private List<String> urlPhotoArray;
public DolanImageViewHolder(@NonNull View itemView) {
super(itemView);
imgDetailData = itemView.findViewById(R.id.img_detail_item_data);
}
public void showImageArray(DolanItemClass dolanItemClass){
urlPhotoArray = dolanItemClass.getUrl_photo_collage();
Glide.with(itemView.getContext()).load(urlPhotoArray).into(imgDetailData);
Log.d("Pesan", "List"+urlPhotoArray);
}
}
该url_photo_college
项目将显示在详细活动中。但不幸的是,rectclerview 什么也没显示。它通过方法显示数据显示
DetailTouristActivity.class
package co.id.roningrum.firebasearrayimage;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
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.Query;
import com.google.firebase.database.ValueEventListener;
public class DetailTouristListAct extends AppCompatActivity {
private ImageView imgDetailData;
private TextView tvNamaDetail, tvAlamatDetail, tvDescDetail;
private RecyclerView rvImageDetailCollages;
private DatabaseReference databaseReference;
private ValueEventListener valueEventListener;
private FirebaseRecyclerAdapter<DolanItemClass, DolanImageViewHolder> firebaseRecyclerAdapter;
public static final String EXTRA_WISATA_KEY = "tourist_key";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_tourist_list);
String touristKey = getIntent().getStringExtra(EXTRA_WISATA_KEY);
if(touristKey == null){
throw new IllegalArgumentException("Must pass Extra");
}
imgDetailData = findViewById(R.id.img_detail_data);
tvNamaDetail = findViewById(R.id.tv_name_detail);
tvAlamatDetail = findViewById(R.id.tv_info_tourism_detail);
tvDescDetail = findViewById(R.id.tv_address_detail);
rvImageDetailCollages = findViewById(R.id.rv_photo_collage);
databaseReference = FirebaseDatabase.getInstance().getReference().child("Tourism").child(touristKey);
rvImageDetailCollages.setLayoutManager(new GridLayoutManager(this, 2));
LoadDetailData();
}
private void ShowCollage() {
Query query = databaseReference.child("url_photo_collage");
FirebaseRecyclerOptions<DolanItemClass> options = new FirebaseRecyclerOptions.Builder<DolanItemClass>()
.setQuery(query, DolanItemClass.class)
.build();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<DolanItemClass, DolanImageViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull DolanImageViewHolder dolanImageViewHolder, int i, @NonNull DolanItemClass dolanItemClass) {
dolanImageViewHolder.showImageArray(dolanItemClass);
}
@NonNull
@Override
public DolanImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new DolanImageViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_image_data, parent, false));
}
};
firebaseRecyclerAdapter.notifyDataSetChanged();
rvImageDetailCollages.setAdapter(firebaseRecyclerAdapter);
}
private void LoadDetailData() {
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
DolanItemClass dolanItemClass = dataSnapshot.getValue(DolanItemClass.class);
tvNamaDetail.setText(dolanItemClass.getName_tourism());
tvAlamatDetail.setText(dolanItemClass.getLocation_tourism());
tvDescDetail.setText(dolanItemClass.getInfo_tourism());
Glide.with(getApplicationContext()).load(dolanItemClass.getUrl_photo()).into(imgDetailData);
ShowCollage();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
}
@Override
protected void onStart() {
super.onStart();
LoadDetailData();
if(firebaseRecyclerAdapter!=null){
firebaseRecyclerAdapter.startListening();
}
}
@Override
protected void onStop() {
super.onStop();
databaseReference.removeEventListener(valueEventListener);
}
}
输出目标是recyclerview可以显示数据即使item数据类型是List
解决方案
这是错误
urlPhotoArray = dolanItemClass.getUrl_photo_collage();
如果您想要第一个元素,则必须通过添加 .get(0) 从列表中调用索引。
你的代码应该是
urlPhotoArray = dolanItemClass.getUrl_photo_collage().get(0);
推荐阅读
- reactjs - Next.js 中的默认动态路由
- bash - Conda 创建环境 - 找不到兼容的 Shell
- sql - 重命名大表
- c# - Groupby,选择EF Ccore 3.1
- python - HuggingFace SciBert AutoModelForMaskedLM 无法导入
- java - 如何使用可变参数将任意数量的相同类型参数传递给方法?
- javascript - 使用 JavaScript 更改 SVG 路径的单个值
- python - Python - 打开多个文件并输出文件名
- python - 我想通过网络抓取从谷歌学者那里获得一篇文章的 bibTex 引用
- r - 在 R 中,使用带有 rank() 的第二列来打破平局