Android 在列表视图中显示Firebase的文本视图和图像
这是我数据库中的数据 我想将数据中的“宠物名”(TextView)和“imageRef”(imageView)字段显示到ListView中,当我运行此代码时,我没有任何错误,但它仍然不会显示数据中的文本或图像(它显示的是一个空页) 谁能告诉我我做错了什么?! 谢谢♥ 我有一个模型课:Android 在列表视图中显示Firebase的文本视图和图像,android,listview,firebase,firebase-realtime-database,Android,Listview,Firebase,Firebase Realtime Database,这是我数据库中的数据 我想将数据中的“宠物名”(TextView)和“imageRef”(imageView)字段显示到ListView中,当我运行此代码时,我没有任何错误,但它仍然不会显示数据中的文本或图像(它显示的是一个空页) 谁能告诉我我做错了什么?! 谢谢♥ 我有一个模型课: public class ModelClass { String Nume,imagine; public String getNume() { return Nume;
public class ModelClass {
String Nume,imagine;
public String getNume() {
return Nume;
}
public void setNume(String nume) {
Nume = nume;
}
public String getImagine() {
return imagine;
}
public void setImagine(String imagine) {
this.imagine = imagine;
}
public ModelClass(String nume, String imagine) {
Nume = nume;
this.imagine = imagine;
}
}
public class ModelClass {
@PropertyName("pet name")
String Nume;
@PropertyName("imageRef")
String imagine;
//...
我的适配器:
public class MyAdapt extends ArrayAdapter<ModelClass> {
private Activity context;
private int resource;
private List<ModelClass> listImage;
public MyAdapt(@NonNull Activity context, @LayoutRes int resource, @NonNull List<ModelClass> objects) {
super(context, resource, objects);
this.context = context;
this.resource = resource;
listImage = objects;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View v = inflater.inflate(resource, null);
TextView tvName = (TextView) v.findViewById(R.id.tvPetName);
ImageView img = (ImageView) v.findViewById(R.id.iv2);
tvName.setText(listImage.get(position).getNume());
Glide.with(context).load(listImage.get(position).getImagine()).into(img);
return v;
}
public void addElement(ModelClass element) {
listImage.add(element);
}
}
公共类MyAdapt扩展了ArrayAdapter{
私人活动语境;
私有int资源;
私有列表列表图像;
公共MyAdapt(@NonNull活动上下文、@LayoutRes int-resource、@NonNull列表对象){
超级(上下文、资源、对象);
this.context=上下文;
这个资源=资源;
listImage=对象;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
LayoutInflater充气器=上下文。getLayoutInflater();
视图v=充气机。充气(资源,空);
TextView tvName=(TextView)v.findViewById(R.id.tvPetName);
ImageView img=(ImageView)v.findViewById(R.id.iv2);
setText(listImage.get(position.getNume());
Glide.with(context).load(listImage.get(position.getImagine()).into(img);
返回v;
}
公共无效添加元素(ModelClass元素){
添加(元素);
}
}
以及列表视图所在的页面:
public class PetFeed2 extends AppCompatActivity {
private DatabaseReference mDatabaseRef;
private List<ModelClass> imgList;
private ListView lv;
private MyAdapt myAdapter;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pet_feed2);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
imgList = new ArrayList<>();
lv = (ListView) findViewById(R.id.lv);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Please wait loading list image...");
progressDialog.show();
mDatabaseRef = FirebaseDatabase.getInstance().getReference("Data");
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
progressDialog.dismiss();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ModelClass img = snapshot.getValue(ModelClass.class);
imgList.add(img);
}
myAdapter = new MyAdapt(PetFeed2.this, R.layout.custumpet, imgList);
lv.setAdapter(myAdapter);
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
progressDialog.dismiss();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
ModelClass img = snapshot.getValue(ModelClass.class);
myAdapter.addElement(img);
}
myAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
公共类PetFeed2扩展了AppCompative活动{
私有数据库引用mDatabaseRef;
私人名单;
私有ListView lv;
私有myAdapter;
私有进程对话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u pet\u feed2);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
imgList=newarraylist();
lv=(ListView)findViewById(R.id.lv);
progressDialog=新建progressDialog(此);
setMessage(“请等待加载列表图像…”);
progressDialog.show();
mDatabaseRef=FirebaseDatabase.getInstance().getReference(“数据”);
mDatabaseRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
progressDialog.disclose();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
ModelClass img=snapshot.getValue(ModelClass.class);
imgList.add(img);
}
myAdapter=新的MyAdapt(PetFeed2.this,R.layout.custumpet,imgList);
lv.设置适配器(myAdapter);
mDatabaseRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
progressDialog.disclose();
对于(DataSnapshot快照:DataSnapshot.getChildren()){
ModelClass img=snapshot.getValue(ModelClass.class);
myAdapter.addElement(img);
}
myAdapter.notifyDataSetChanged();
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
}
问题是您需要读取字段pet name
和imageRef
,但是ModelClass对象没有与这些字段匹配的变量。因此,您需要在ModelClass中执行以下操作:
public class ModelClass {
String Nume,imagine;
public String getNume() {
return Nume;
}
public void setNume(String nume) {
Nume = nume;
}
public String getImagine() {
return imagine;
}
public void setImagine(String imagine) {
this.imagine = imagine;
}
public ModelClass(String nume, String imagine) {
Nume = nume;
this.imagine = imagine;
}
}
public class ModelClass {
@PropertyName("pet name")
String Nume;
@PropertyName("imageRef")
String imagine;
//...
这样,您就可以将字段petname
与变量Nume
匹配,并将其与另一个变量匹配
编辑:
现在在适配器中更改以下内容:
View v = inflater.inflate(resource, null);
与
在我修改它之后,我可以看到我的错误,它说我的LIstview所在的页面中的行“ModelClass img=snapshot.getValue(ModelClass.class);”有问题。你知道我怎么修吗?:)不,我不知道FirebaseUI,我应该学习它吗?你是对的,现在应用程序没有崩溃,但出于某种原因,我的listview上仍然没有任何内容:(我想你需要在你的适配器上做一个更改。请看我的回答你太好了,很抱歉打扰了你!!我在适配器上更改了你说的那行,但它仍然显示一个空白页:(,你知道我是否还有其他问题吗?你为什么有这个
mDatabaseRef.addValueEventListener(…
两次?我不知道,但这可能是问题所在。无论如何,看看这本使用ArrayAdapter的指南:它可以很有用