Мой GridView/ListView отображается только после касания в Android API 18+

ОБНОВЛЕНИЕ: Мое представление сетки/списка, основанное на моем BaseAdapter, перестало работать в Android 4.3. Если я запускаю его на Android 4.2 или ниже, он работает нормально.

Я попробовал это с «тупым» getView(), который каждый раз раздувает новое представление, это ничего не меняет.

ИСХОДНЫЙ ВОПРОС:

У меня есть список и сетка. Это 2 разных графических представления моих данных. Моя проблема касается обоих, поэтому с этого момента я буду писать только adapterview, но это может означать и то, и другое.

Я настроил свой адаптер с помощью своего собственного адаптера, который расширяет BaseAdapter. В основном это работает, но иногда, когда я меняю настройки (в намерении PreferenceActivity) и меняю свой набор данных, вызываю notifyDataSetChanged(), экран не обновляется. Точнее, часть пунктов обновляется, а остальные остаются на экране, как и были до изменения.

Я прочитал много руководств, посмотрел видео Ромена Гая и, кажется, пропустил одну очень важную вещь, но не могу понять что это.

Я добавил некоторую отладку, и странно то, что после того, как я вызываю notifyDataSetChanged(), он вызывает getCount(), и вы можете видеть, что число изменилось, и даже вызывает getView(), он просто не обновляет элементы на экране. Однако после того, как я касаюсь экрана, все отображается (хотя getView() снова вызывается для всех видимых представлений)

Это начало моей функции getView():

public View getView(final int position, final View convertView1, final ViewGroup parent) {
    Log.d(TAG, "getView(" + position + ", " + convertView1 + ", " + parent + ")");
    ViewHolder holder;
    CategoryListItemView convertView = null;
    if (convertView1 == null) {
        if (SettingsActivity.getBrowserLayout(CategoryBrowserActivity.this)) {
            convertView = (CategoryListItemView)inflator.inflate(R.layout.category_list_item, parent, false);
        } else {
            convertView = (CategoryListItemView)inflator.inflate(R.layout.category_grid_item,parent, false);
        }
        holder = new ViewHolder();
        holder.imageView = (ImageView)convertView.findViewById(R.id.category_item_icon);
        holder.textView = (TextView)convertView.findViewById(R.id.category_browser_list_title);
        holder.featuresLayout = (LinearLayout)convertView.findViewById(R.id.features);
        convertView.setTag(holder);
        convertView.setFilter(getCategoryFilter());
        convertView.setOnClickListener(this);
        convertView.setOnLongClickListener(this);
    } else {
        convertView = (CategoryListItemView)convertView1;
        holder = (ViewHolder)convertView.getTag();
    }

Причина, по которой я привожу convertView1 к CategoryListItemView, заключается в том, что я использую его пользовательские функции позже в getView().

Мое представление адаптера — это либо GridView, либо ListView, и элементы, соответственно, либо category_grid_item, либо category_list_item, и всякий раз, когда я переключаюсь между двумя визуализациями, я аннулирую адаптер (и в любом случае моя проблема не там)


person Gavriel    schedule 16.03.2014    source источник


Ответы (1)


Вы должны вызвать adapter.notifyDatasetChanged() в потоке пользовательского интерфейса

person g_vk    schedule 11.08.2014