Android с Listview и Firebase - PullRequest
0 голосов
/ 24 августа 2018

Есть ли какая-либо ошибка в коде, потому что я получаю единственную цену в списке, а не имя, может ли кто-нибудь мне помочь?Я пробовал так много методов, чтобы решить эту проблему, но в итоге он позволил мне опубликовать в 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) {

       }
   });

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Ответ от 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();
   }
});

Как вы увидите, мы теперь называем notifyDataSetChanged() внутри onChildAdded. Это позволяет адаптеру узнать, что его данные изменились, что, в свою очередь, означает, что он обновляет представление списка.

0 голосов
/ 24 августа 2018

вы можете установить только один адаптер в виде списка, поэтому вы получаете результат недавнего назначения адаптера

@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, чтобы показать несколько значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...