Пользовательский адаптер 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();

}

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

гмм!

Другие вопросы по тегам