更新: BaseAdapter に基づくグリッドビュー/リストビューが Android 4.3 で動作しなくなりました。Android 4.2 以下で実行すると、正常に動作します。
毎回新しいビューを膨らませる「ダム」getView()で試してみましたが、何も変わりません。
元の質問:
リストビューとグリッドビューがあります。これらは、私のデータの 2 つの異なるグラフィック表現です。私の問題は両方に当てはまるので、これからは adapterview のみを記述しますが、両方を意味する可能性があります。
BaseAdapter を拡張するカスタム アダプターを使用して、アダプター ビューをセットアップします。ほとんどの場合は機能しますが、(PreferenceActivity インテントで) 設定を変更し、データセットを変更して notifyDataSetChanged() を呼び出すと、画面が更新されないことがあります。より正確には、一部の項目は更新されますが、残りは変更前と同じように画面に表示されます。
私は多くのチュートリアルを読み、Romain Guy のビデオを見ましたが、非常に基本的なことを見逃しているようですが、それが何であるかを理解できません。
デバッグを追加しましたが、奇妙なことに、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のいずれかであり、2つの視覚化の間で変更するたびにアダプターを無効にします(とにかく私の問題はありません)