ОБНОВЛЕНИЕ: Мое представление сетки/списка, основанное на моем 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, и всякий раз, когда я переключаюсь между двумя визуализациями, я аннулирую адаптер (и в любом случае моя проблема не там)