1

ListAdapter に次のコードがあります

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View childView, ViewGroup parent)
    {
        I dataItemForChild = null;
        if (childPosition >= dataModel.size())
        {
            // its an extra row
        }
        else
        {
            dataItemForChild = (I) getChild(groupPosition, childPosition);
        }

        boolean isEvenRow = (childPosition % 2 == 0);
        if (childView == null)
        {
            final HashMap<Integer, View> viewMap = new HashMap<Integer, View>();
            childView = inflateChildView(isLastChild, isEvenRow, childPosition, groupPosition, dataItemForChild);
            childView.setTag(viewMap);
            addViewMappingCache(viewMap, childView);
            populateChildView(isLastChild, isEvenRow, childPosition, groupPosition, dataItemForChild, childView, viewMap);
        }
        else
        {
            populateChildView(isLastChild, isEvenRow, childPosition, groupPosition, dataItemForChild, childView, (HashMap<Integer, View>) childView.getTag());
        }
        return childView;
    }

問題は、リスト内のさまざまな行に使用するさまざまなレイアウトがあることです。データを更新してから adapter.notifyDataChanged() を呼び出すと、childView が null ではないため、inflateChildView が再度呼び出されないため、一部の行のレイアウトがデータに必要なレイアウトと一致しなくなります。

特定の行を「無効化」する方法や、そのレイアウト キャッシュを吹き飛ばして、渡す childView が null になる方法はありますか?

私が実装しようとしている特定のユースケースは、「もっと読み込む」という特別な最後の行です。さらにロードしたら、その LoadMore 行をデータ行に置き換えてから、(それ以上ある場合) 新しい最後の行を LoadMore 行にする必要があります。

4

1 に答える 1

1

getItemViewTypeを使用してみましたか。リストにさまざまな種類の行が含まれていると便利です。アダプターの実装では、各種類の行のキャッシュを個別に管理します。

于 2012-11-05T08:24:16.710 に答える