2017-02-03 4 views
2

У меня есть очень простой Firebase базы данных, которая выглядит следующим образом: enter image description hereКак отобразить точное количество элементов из базы данных Firebase в ListView с помощью FirebaseListAdapter с Android?

Это моя модель:

public class ShoppingListModel { 
    private String shoppingListName; 
    private Map<String, String> usersMap; 

    public ShoppingListModel() {} 

    public void setShoppingListName(String shoppingListName) {this.shoppingListName = shoppingListName;} 
    public String getShoppingListName() {return shoppingListName;} 

    public void setUsersMap(Map<String, String> usersMap) {this.usersMap = usersMap;} 
    public Map<String, String> getUsersMap() {return usersMap;} 
} 

Все, что я хочу сделать, это для отображения в ListView только списках, которые принадлежат один пользователь и имеет значение true. С помощью этого кода:

Query query = databaseReference.child("ShoppingLists").orderByChild("shoppingListName"); 
firebaseListAdapter = new FirebaseListAdapter<ShoppingListModel>(this, ShoppingListModel.class, android.R.layout.simple_list_item_1, query) { 
     @Override 
     protected void populateView(View v, ShoppingListModel slm, int position) { 
      for (Map.Entry<String, String> entry : slm.getUsersMap().entrySet()) { 
       String key = entry.getKey(); 
       String value = entry.getValue(); 
       if (key.equals("[email protected]l,com") && value.equals("true")) { 
        ((TextView)v.findViewById(android.R.id.text1)).setText(slm.getShoppingListName()); 
       } 
      } 
     } 
    }; 
    ListView listView = (ListView) findViewById(R.id.list_view); 
    listView.setAdapter(firebaseListAdapter); 

Я получаю пустой вид, как показано на изображении ниже.

enter image description here

Как я могу отобразить элементы в ListView правильно?

ответ

2

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

Я предлагаю вам реструктурировать базу данных, чтобы упростить запросы: добавьте еще один узел, в котором вы храните имя и идентификатор каждого пользователя. Как это:

"userLists" : { 
    "[email protected]" : { 
     "-Kbvasnd23sdj" : "bbb", 
     "-Kbvasndaisdj" : "aaa", 
     "-Kbvasxzvisdj" : "ddd" 
    }, 
    "[email protected]" : { 
     "-Kbvasndaisxz" : "ccc" 
    } 
    } 

Таким образом, если вы хотите, чтобы получить все списки от конкретного пользователя, вы будете использовать:

Query query = FirebaseDatabase.getInstance().getReference().child("userLists/[email protected]"); 

И вы, очевидно, хотят, чтобы дать пользователю возможность щелкнуть по элементу и просмотреть список. Вы можете сделать это, убедившись, что идентификатор push в каждом узле от userLists совпадает с идентификатором с узла ShoppingLists.

Вкратце: когда вы показываете список, вы читаете данные с узла userLists. Когда вы показываете данные списка, вы читаете данные с узла ShoppingLists. Что-то, что вы должны иметь в виду при создании баз данных на Firebase:

Структура ваших данных после вашего вида.

Для получения дополнительной информации о том, как это сделать, я рекомендую вам посмотреть Firebase Database for SQL Developers series.

+0

Да, это сработало очень хорошо. Спасибо! –

3

Вы не показываете, что query в вашем коде, поэтому я предполагаю, что это всего лишь DatabaseReference для всего на /ShoppingLists. Если вы это сделаете, вы получите звонок для populateView для каждого ребенка в этом месте. Это означает, что вас попросят сделать вид за каждые ребенка. Вы не можете выбрать, будет ли отображаться представление для этого элемента.

Похоже, вы предполагаете, что ваш оператор if в populateView пропустит этот элемент. Но на самом деле происходит то, что вы просто позволяете пустому виду занимать это место в списке.

Вместо этого вы должны найти запрос, который генерирует только интересующие вас объекты. Это означает, что вам нужно сообщить Firebase filter for children, которые соответствуют вашим критериям. К сожалению, ваши критерии - это два условия (количество пользователей под userMap и значение логического для этого ключа пользователя). Firebase не может выполнять такую ​​фильтрацию.

Таким образом, FirebaseListAdapter не поможет вам в этом, так как он принимает только данные из одного запрашиваемого вами запроса.

Вместо этого вам нужно будет прочитать все содержимое местоположения, вручную отфильтровать элементы, которые вы не хотите, и создать список предметов, которые вы хотите. Вы можете построить адаптер с этим списком, а затем он может стать входом в ListView (или лучше, RecyclerView).

+0

Я только что редактировал свое сообщение с 'query'. Но вы были правы, это всего лишь DatabaseReference для всего в/ShoppingLists. Теперь я понимаю, в чем проблема. Не могли бы вы посоветовать мне, как вручную отфильтровать элементы, которые мне не нужны? Спасибо! –

+0

Вы можете использовать addListenerForSingleValueEvent(), чтобы получить DataSnapshot всего в этом месте. Извлеките дочерние элементы снимка и проверьте, содержит ли каждая из них что-то, что вы хотите показать, а затем добавьте их в новый список, чтобы заполнить ваш адаптер. –

 Смежные вопросы

  • Нет связанных вопросов^_^