2

更新: 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つの視覚化の間で変更するたびにアダプターを無効にします(とにかく私の問題はありません)

4

1 に答える 1

2

UIスレッドで adapter.notifyDatasetChanged() を呼び出す必要があります

于 2014-08-11T11:03:18.200 に答える