3

http://bartinger.at/listview-with-sectionsseparators/で説明されている手法に従って、セクションを含む ListView を構築しています。しかし、セクション以外のアイテムに convertView を再利用して拡張したいと思います。ただし、 getView() メソッドが入力されるたびに convertView 変数が null であることがわかりました。誰かがなぜこれが当てはまるのか説明できますか?

ViewHolder holder;
final ListViewItem item = items.get(position);

if (item.isSection()) {
    Section section = (Section)item;

    convertView = inflater.inflate(R.layout.section, null);
    TextView title = (TextView) convertView.findViewById(R.id.section_title);
    title.setText(section.title);
} else {
    if (convertView == null) {
        Log.d("Adapter", "convertView was null");
    }

    Server server = (Server)item;

    convertView = inflater.inflate(R.layout.server_row, null);
    holder = new ViewHolder();
    holder.serverName = (TextView) convertView.findViewById(R.id.server_name);
    holder.serverStatusIcon = (ImageView)convertView.findViewById(R.id.server_status_icon);
    convertView.setTag(holder);

    holder.serverName.setText(server.name);
}

return convertView;

リストはエラーなしで作成および表示されており、セクションと非セクションの両方のアイテムが含まれています。

4

3 に答える 3

5

正しく実装していますか

getItemViewType (int position) ?

Androidのドキュメントから参照してください:

戻り値

ビューのタイプを表す整数。getView(int, View, ViewGroup) で一方を他方に変換できる場合、2 つのビューは同じタイプを共有する必要があります。注: 整数は 0 から getViewTypeCount() - 1 の範囲内である必要があります。IGNORE_ITEM_VIEW_TYPE も返される可能性があります。

したがって、アダプターはどのアイテムが一緒に属しているかを認識していないため、 convertView は常に null である可能性があり、どのアイテムがリサイクルされるかがわからない...

これを試して:

@Override
public int getItemViewType(int position) {
    if (((MyItem)getItem(position)).isHeader()) {
        return 1;
    } else {
        return 0;
    }
}

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

getItemViewType で返すインデックスは、ヘッダーと非ヘッダーをグループ化する単なる識別子です。

この場合、モデル項目にメソッド「isHeader」(または類似の) を実装する必要があります。

于 2012-06-20T18:13:22.243 に答える
0

頭を悩ませてくれたIxxに感謝します。気づかなかったのは、リストが短すぎて実際に画面に表示されなかったため、リサイクルが行われていなかったことです。

完全を期すために、複数のビュータイプを作成する場合、getView()はデフォルトの実装(以下)に従って、getItemViewType()とgetViewTypeCount()をオーバーライドしなくてもconvertViewを返すことを追加します。もちろん、それはあなたが望む振る舞いではないでしょう。

public int getItemViewType(int position) {
    return 0;
}

public int getViewTypeCount() {
    return 1;
}
于 2012-06-20T19:52:20.893 に答える
0

作成した GridView でこれを実行しました。新しく膨張したビューを convertView に割り当てようとしたときに問題が発生しました。私が採用した一般的な構造は

public View getView(int position, @Nullable View convertView, ViewGroup parent) {

    View newView = null;
    TextView someText;

    // Test to see if there is already a view, if not create one, else use what is
    // already existant in convertView
    if (null == convertView) {
        // inflate your view type into newView here
        newView = myInflater.inflate(R.layout._________);

        // Get all of your subviews you wish to edit here from newView
        someText = (TextView)newView.findViewById(R.id._______);
    }else{
        // Get all of your subviews you wish to edit here from convertView
        someText = (TextView)convertView.findViewById(R.id._______);
    }

    // Perform all re-alignments, view layouts etc... here

    // Perform all updating of subviews data here

    // Return structure
    if (null == convertView) {
        return newView;
    } else {
        return convertView;
    }
}

お役に立てれば!

于 2012-06-20T17:59:50.813 に答える