9

さまざまなタイプのビュー行を使用するリストビューアダプタがあります。

ほとんどの場合、正常に動作します。しかし、リストから要素を削除すると、クラッシュします。間違ったタイプのconvertViewをgetViewに送信します

public View getView(int position, View convertView, ViewGroup patent) ...  

しかし、getItemViewTypeは正しいタイプを返しています。

public int getItemViewType(int position)

こんな感じです

位置1-のタイプを教えてください->正しいタイプを返します(たとえば1)

間違ったタイプ(たとえばタイプ2)のコンテンツビューを含む位置1のビューを教えてください

何か案は?

4

4 に答える 4

20

getViewTypeCount()をオーバーライドしてみてください

@Override
public int getViewTypeCount() {
       return types;
}

getView(int、View、ViewGroup)によって作成されるビューのタイプの数を返します。各タイプは、getView(int、View、ViewGroup)で変換できるビューのセットを表します。

于 2011-12-27T08:33:13.387 に答える
3

正しく実装されると、ListViewは、convertViewとして提供されるビューが正しいタイプからのものであることを保証します

     /**
     * @return A view from the ScrapViews collection. These are unordered.
     */
    View getScrapView(int position) {
        if (mViewTypeCount == 1) {
            return retrieveFromScrap(mCurrentScrap, position);
        } else {
            int whichScrap = mAdapter.getItemViewType(position);
            if (whichScrap >= 0 && whichScrap < mScrapViews.length) {
                return retrieveFromScrap(mScrapViews[whichScrap], position);
            }
        }
        return null;
    }

をオーバーライドgetViewTypeCount()して、使用しているビュータイプの数をgetItemViewType(int position)返し、0〜の範囲のビュータイプを返すようにオーバーライドする必要があります。getViewTypeCount() - 1

于 2013-10-08T02:49:37.853 に答える
1

これは正常なことです。Viewで別のタイプのを取得した場合convertViewは、を作成しnew View、再利用はしませんconvertView

おそらく、指定されたタイプの再利用可能なビューはありません。

:この回答は2011年のものであり、適用されなくなる可能性があります。

于 2011-12-21T03:18:56.893 に答える
1

同じ問題が発生し、クラッシュまたは予期しない動作が発生しました。
これが私の問題を修正した方法です:

    getViewTypeCount()は、ビュー内のさまざまなタイプの行の数を返す必要があります
    getItemViewType(...)は、位置にあるアイテムのタイプを返す必要があります
    getView(...)は、膨らんだときにビューに列挙型を設定する必要があります
@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return mlistItems.get(position).type.ordinal();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ListItem item = mListems.get(position);

    if (convertView == null) {
        switch (item.type) {
            case Header:
                converview = // Inflate Header Row
                break;
            case Content:
                converview = // Inflate Content Row
                break;
        }
    }

    switch (item.type) {
            case Header:
                //Set header row content
                break;
            case Content:
                //Set content row content
                break;
    }

    return convertView;
}
于 2016-03-16T19:22:33.677 に答える