Пользовательский адаптер getView вызывается только во время отладки
У меня есть действие, единственная цель которого - отобразить представление списка. Существует специальный адаптер для обслуживания представлений для каждого элемента в массиве.
У меня есть точки останова повсюду, и когда я отлаживаюсь, он останавливается в "подсчете" несколько раз - первые несколько раз возвращаемое значение равно нулю, затем оно меняется на 3 (правильное значение в этом случае). Затем мы останавливаемся в "getView" - все происходит правильно, и после того, как мы закончим со всеми точками останова, затем presto magico все три записи отобразятся на экране. Да!
Затем я пытаюсь запустить приложение вне отладчика. Я получаю сообщение журнала о том, что оно посещено, "count", и в сообщении журнала отображается возвращаемое значение, поэтому я знаю, что это правильно, но "getView" никогда не вызывается!!
Я не уверен, какие фрагменты кода имеют отношение к этому вопросу и не хотят загрязнять вопрос всем проектом; пожалуйста, дайте мне знать, если есть определенный раздел, который будет полезен. Я исследовал все вопросы "getView not named", но они последовательно относятся к случаю, когда getView никогда не вызывается, что явно может быть моим… иногда:(
РЕДАКТИРОВАТЬ: код адаптера
public class DivisionAdapter extends BaseAdapter {
private static final String TAG = "DIV_ADAPT";
private ArrayList<Division> divisionList;
private Context context;
public DivisionAdapter(Context c, ArrayList<Division> divList) {
divisionList = divList;
context = c;
}
@Override
public int getCount() {
Integer count = 0;
if (divisionList != null) count = divisionList.size();
Log.v(TAG,count.toString());
return count;
}
@Override
public Object getItem(int position) {
Object o = null;
if (divisionList != null)
o = divisionList.get(position);
return o;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.v(TAG,"getView");
if (divisionList == null)
return null;
LinearLayout divisionView = null;
Division thisDiv = divisionList.get(position);
if (convertView == null) {
divisionView = new LinearLayout(context);
LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
li.inflate(R.layout.division_item, divisionView, true);
} else {
divisionView = (LinearLayout) convertView;
}
Log.v(TAG,thisDiv.name());
TextView v = (TextView) divisionView.findViewById(R.id.divisionName);
v.setText(thisDiv.name());
v = (TextView) divisionView.findViewById(R.id.divisionRegion);
v.setText(thisDiv.region());
return divisionView;
}
public void setList(ArrayList<Division> newList) {
divisionList = null;
divisionList = newList;
}
}
И на всякий случай это полезно, некоторые фрагменты из класса деятельности:
@Override
public void onResume() {
super.onResume();
refreshList();
}
private void refreshList() {
// use the class static query method to get the list of divisions
Division.query(Division.class,
new StackMobQuery().fieldIsEqualTo("status", "ACTIVE"),
new StackMobQueryCallback<Division>() {
@Override
public void failure(StackMobException arg0) {
// TODO Auto-generated method stub
Log.v(TAG, "query fail");
}
@Override
public void success(List<Division> arg0) {
Log.v(TAG, "query success");
divAdapt.setList((ArrayList<Division>) arg0);
divAdapt.notifyDataSetChanged();
}
});
}
РЕДАКТИРОВАТЬ 2/11: Я нашел этот вопрос: маркеры не отображаются на карте после запроса стекамоба, который показывает неизвестный до сих пор факт, что запросы стекового моба выполняются в фоновом потоке. Я начинаю исследовать отношения между потоками и адаптерами и подумал, что поделюсь этим ключом на случай, если он поможет кому-нибудь еще понять, что здесь происходит, быстрее, чем я. ТИА.
1 ответ
Я знаю, почему это КОГДА-ЛИБО работало в отладчике - это оказалось красной селедкой.
Как обнаружено, метод статического запроса StackMobModel выполняется в фоновом потоке, из которого вызов NotifyDataSetChanged() совершенно неэффективен.
В итоге я заменил метод успеха в StackMobQueryCallback следующим образом:
@Override
public void success(final List<Division> arg0) {
Log.v(TAG, "query success");
runOnUiThread(new Runnable() {
public void run() {
updateList((ArrayList<Division>) arg0);
}
});
}
а затем добавил этот новый метод
private void updateList(ArrayList<Division> newList) {
divAdapt.setList(newList);
divAdapt.notifyDataSetChanged();
}
теперь, когда запрос возвращается, обновление адаптера направлено на выполнение в нужном потоке, и, ура, все выглядит сшитым просто замечательно и модно.
гмм!