2015-10-11 3 views
-1

Я использую ParseQueryAdapter для отображения ListView включая набор элементов, заданных в запросе Разбор:управления ListView GetCount() всегда возвращает 0

ParseQueryAdapter.QueryFactory<AlertObject> factory = 
     new ParseQueryAdapter.QueryFactory<AlertObject>() { 
      public ParseQuery<AlertObject> create() { 
       ParseQuery<AlertObject> query = AlertObject.getQuery(); 
       query.orderByDescending(AlertObject.TIMESTAMP_KEY); 
       query.fromLocalDatastore(); 
       return query; 
      } 
     }; 

alertsListAdapter = new AlertListItemAdapter(activity, factory, thisFragment); 
ListView alertsListView = (ListView) rootView.findViewById(R.id.alerts_list_view); 
alertsListView.setAdapter(alertsListAdapter); 

Теперь я хотел бы знать количество элементов в ListView, но если я позвоню alertsListView.getCount(), он вернется 0. Что я делаю не так?

EDIT: кто-то дал это сообщение отрицательному голосу, но не оставляя комментарии или просьбы о разъяснении. Поэтому я прошу объяснения причины этого, чтобы улучшить читаемость моего вопроса.

UPDATE: ниже моего адаптера

public class AlertListItemAdapter extends ParseQueryAdapter<AlertObject> { 

    private Context context; 
    private Fragment listAlertsFragment; 

    public AlertListItemAdapter(Context context, 
           ParseQueryAdapter.QueryFactory<AlertObject> queryFactory, 
           Fragment fragment) { 
     super(context, queryFactory); 
     this.context = context; 
     this.listAlertsFragment = fragment; 
    } 

    @Override 
    public View getItemView(final AlertObject alertObject, View view, final ViewGroup parent) { 
     [...] 
    } 

    @Override 
    public int getCount() { 
     return super.getCount(); 
    } 
} 
+0

Возможно, вы не добавили код для адаптера. – ataulm

+0

Я только что обновил свой вопрос! :) –

+0

Можете ли вы продемонстрировать, что запрос выполнен и содержит ненулевое количество элементов? – ataulm

ответ

2

Я подозреваю (не уверен, не увидев код/​​документы анализа), что адаптер не сразу заполняется элементами, а когда запрос выполняется, он сам вызовет notifyDataSetChanged(), чтобы ListView запрашивал его для элемента Просмотры.

Это объясняет, почему ваш getCount() возвращает 0 сразу после setAdapter(ListAdapter), но почему вы также можете увидеть 33 предмета.

Вы можете проверить эту регистрацию adapter.getCount(), как вы делаете, и, кроме того, перекрывая notifyDataSetChanged в то соблюдать порядок заявлений:

public class AlertListItemAdapter extends ParseQueryAdapter<AlertObject> { 

    public AlertListItemAdapter(
      Context context, 
      ParseQueryAdapter.QueryFactory<AlertObject> queryFactory, 
      Fragment fragment) { 
     super(context, queryFactory); 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     super.notifyDataSetChanged(); 
     Log.d("FOO", "item count: " + getCount()); 
    } 

    @Override 
    public View getItemView(AlertObject alertObject, View view, ViewGroup parent) { 
     Log.d("FOO", "getItemView()"); 
     ... 
    } 

    ... 
} 

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

adapter.registerDataSetObserver(new DataSetObserver() { 
    @Override 
    public void onChanged() { 
     super.onChanged(); 
     Log.d("Foo", adapter.getCount()); 
    } 
}); 
+0

Да, возможно, это проблема. Однако я заметил, что отладочная печать, вызывающая '' getCount() '', появляется после того, как элементы отображаются в '' ListView''. По этой причине я не могу понять, почему '' getCount() '' возвращает 0. Я имею в виду, что если печать отображается после совокупности «ListView», адаптер должен уже иметь элементы, не так ли? –

+0

Да, должно. Можете ли вы переопределить 'notifyDataSetChanged()' для определения порядка вызовов? – ataulm

+0

До: '' 10-11 22: 15: 43.144 20519-20519/com.goapps.gosafe.pro D/(AlertListItemAdapter.java:183): количество элементов: 26''. После: '' 10-11 22: 15: 43.144 20519-20519/com.goapps.gosafe.pro D/(AlertListItemAdapter.java:185): количество элементов: 26''. Похоже, ничего не меняется до и после '' notifyDataSetChanged() ''. –

0

Просто напишите следующую строку, чтобы получить количество элементов в списке:

int count = alertsListView.alertsListAdapter().getCount(); 

После:

alertsListView.setAdapter(alertsListAdapter); 

Так что ваш код будет выглядеть следующим образом:

alertsListAdapter = new AlertListItemAdapter(activity, factory, thisFragment); 
ListView alertsListView = (ListView) rootView.findViewById(R.id.alerts_list_view); 
alertsListView.setAdapter(alertsListAdapter); 
int count = alertsListView.alertsListAdapter().getCount(); 
+0

Уже пробовал, он также возвращает 0. –

+0

@f_ficarola показать свой код, где вы пытаетесь получить счет списка. –

+0

Я только что обновил свой вопрос! :) –

0

Убедитесь, что вы проходите, магазин, и переопределить метод GetCount() правильно.

Пожалуйста, укажите код класса адаптера, если это возможно

+0

Я только что обновил свой вопрос! :) –

0

Вы уверены, что заселен ваш ListView с разбором AlertObjects?

Я думаю, вы должны добавить что-то вроде этого к вашему запросу:

query.findInBackground(new FindCallback<AlertObject>() { 
     @Override 
     public void done(List<AlertObject> alerts, ParseException e) { 
      if (e == null) { 
       // Success 
       mAlerts = alerts; 
       String[] alertObjects = new String[mAlerts.size()]; 
       Log.v(TAG, "There are " + mAlerts.size() + “ on the parse"); 
       } 
      } else { 
       Log.e(TAG, e.getMessage()); 
      } 
     } 
    }); 

Log может сказать вам, сколько объектов у вас есть грамматический разбор. В этом Callback вы можете заполнить ваш ListView, а затем использовать

.getCount(); 

на вашем alertListAdapter.

+0

Да, я уверен, потому что, если я запрашиваю локальное хранилище данных, результатом будет именно набор AlertObjects. Действительно, если вы посмотрите на первую часть моего кода, вы увидите, что фабрика Parse создает ParseQuery типа AlertObject. –

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