【问题标题】:Android With Listview and firebase带有 Listview 和 firebase 的 Android
【发布时间】:2018-08-24 09:22:26
【问题描述】:

代码中是否有任何错误,因为我在列表视图中获得了唯一的价格,而不是名称,任何人都可以帮助我吗?我已经尝试了很多方法来解决它,但最后它让我在 StackOverflow 上发帖向你们寻求帮助,我真的陷入了困境。我会非常感谢你的帮助。如果需要,还将提供模型类。

 private ListView mlistView;
private ArrayList<String>list;
private ArrayAdapter<String> adapter;

private ArrayList<String>Pricelist;
private ArrayAdapter<String> Priceadapter;
private DatabaseReference ref;
private FirebaseDatabase database;
private FoodItemclass fooditem;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rice_after_login);
    final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);



    android.support.v7.app.ActionBar actionBar = getSupportActionBar();
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    actionBar.setTitle("Rice");


    fooditem = new FoodItemclass();
    mlistView = (ListView)findViewById(R.id.listview);
    database = FirebaseDatabase.getInstance();
    ref = database.getReference("Rice");
    list = new ArrayList<>();
    Pricelist = new ArrayList<>();
    adapter = new ArrayAdapter<String>(this,R.layout.list_item,R.id.ItemNameIds,list);
    Priceadapter = new ArrayAdapter<String>(this,R.layout.list_item,R.id.ItemPriceId,Pricelist);
   ref.addChildEventListener(new ChildEventListener() {
       @Override
       public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

               fooditem = dataSnapshot.getValue(FoodItemclass.class);
               list.add(fooditem.getName());
               Pricelist.add(String.valueOf(fooditem.getPrice()));
               mlistView.setAdapter(adapter);
               mlistView.setAdapter(Priceadapter);
       }

       @Override
       public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

       }

       @Override
       public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

       }

       @Override
       public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

       }

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

       }
   });

【问题讨论】:

  • 请分享您的适配器。如我所见,您仅将价目表发送到您的适配器。您还需要发送姓名。您可能会考虑制作一个同时拥有它们的对象。这样您就可以获得将传递给适配器的对象列表。
  • 我没有创建适配器类,我已经创建了模型类,然后将值从 firebase 数据库获取到 listview textviews 但问题是我得到的只是价格而不是名称 :(
  • 请添加您的适配器类的内容。

标签: android firebase listview firebase-realtime-database


【解决方案1】:

您只能将一个适配器设置到您的列表视图,这就是您获得最近分配适配器结果的原因

@Override
   public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

           fooditem = dataSnapshot.getValue(FoodItemclass.class);
           list.add(fooditem.getName()+ " "+String.valueOf(fooditem.getPrice());
           mlistView.setAdapter(adapter);
   }

注意:名称和价格值之间的空格是分隔符

推荐这是一种不好的做法。你应该使用 RecyclerView 来显示多个值

【讨论】:

  • 我也试过这段代码,但它只在一个文本视图上显示数据而不是多个文本视图:(
  • 那么您应该使用自己的自定义 AdapterClass 来这样做
  • 任何参考链接?
  • 我按照您的参考做了所有相同的代码,但是应用程序正在打开并且没有显示任何内容?你能告诉我为什么吗?
  • 您的意思是您也使用了回收站视图方法,但它没有显示任何内容?
【解决方案2】:

faiizii 的回答包含了问题的要点:列表视图中只能有一个适配器,因此您应该只调用一次setAdapter。由于将为每个孩子调用onChildAdded,因此您不应在其中调用setAdapter(也不应在任何其他onChild... 方法中)。

解决方案是将对setAdapter 的调用移出监听器:

list = new ArrayList<>();
adapter = new ArrayAdapter<String>(this,R.layout.list_item,R.id.ItemNameIds,list);
mlistView.setAdapter(adapter);

ref.addChildEventListener(new ChildEventListener() {
   @Override
   public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
       fooditem = dataSnapshot.getValue(FoodItemclass.class);
       list.add(fooditem.getName()+": "+fooditem.getPrice());
       adapter.notifyDataSetChanged();
   }

   ...

   @Override
   public void onCancelled(@NonNull DatabaseError databaseError) {
       throw databaseError.toException();
   }
});

如您所见,我们现在在onChildAdded 中调用notifyDataSetChanged()。这让适配器知道其数据已更改,这反过来意味着它会刷新列表视图。

【讨论】:

  • 没有兄弟,它不起作用:(我仍然得到相同的结果
  • 为什么有两个适配器?每个视图都应该与一个适配器相关联。如果您需要在视图中显示两个值,您应该为每个项目创建一个带有这两个值的单个 List,在该单个 List 上创建一个 ArrayAdapter,然后将单个适配器与视图相关联。
  • 我更新了答案以在单个字符串中显示两个值。但更好的方法是我在之前的评论中所说的。
  • 我也做了同样的事情,但是当我必须将数据从列表视图传递到另一个活动时,它会发送整个字符串,我希望价格和名称在 diff textview 上以便计算进一步处理会很容易,我会坚持下去。
  • 您是否已经研究过如何在每个列表项中获取两个子视图?您发布了一个相当广泛的用例,这绝对是其中的第一个问题。 “如何在列表视图的每个项目中显示两个子视图”听起来像是以前可能已经讨论过的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多