0

convertView で ViewHolder パターンを実装しようとしています。2 つの質問:

1) 行 #1 と #2 (パターンに必要) をコメントすると、すべて正常に動作します。if が配置されると、すべてがスクランブルされ、リストの最初の要素が 2 回 (リストの最初と最後に) 表示され、方向が変更されてリストがスクロールすると、すべてがごちゃごちゃになります。なぜこれが起こっているのですか?

2) ListActivity を使用して、TextView と ArrayAdapter (#3) の文字列の配列を提供していますが、何らかの理由でまだ行 (#4) が必要です。それ以外の場合、リスト項目は空白です。これは、super.getView() を使用していないためですか?

class SushiAdapter extends ArrayAdapter<String> {

    private final Activity context;

    SushiAdapter(Activity context) {
        super(context, R.layout.row, R.id.label, MenuItems); // #3
        this.context = context;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;
                if (row == null) { //#1
                    LayoutInflater inflater = context.getLayoutInflater();
                    row = inflater.inflate(R.layout.row, parent, false);
                    ViewHolder holder = new ViewHolder();
                    holder.icon = (ImageView) row.findViewById(R.id.icon);
                    holder.position = position;
                    holder.item = (TextView) row.findViewById(R.id.label);
                    row.setTag(holder);
                } // #2
                ViewHolder newHolder = (ViewHolder) row.getTag();
                newHolder.item.setText(MenuItems[newHolder.position]); // #4
                newHolder.icon.setImageResource(R.drawable.sushi);
                return row;
    }           
}
4

1 に答える 1

0

たとえば、アレイ アダプタの新しいインスタンスを作成する場合:

ArrayAdapter<T> sushiAdapter = new ArrayAdapter<T>(context, R.layout.row, R.id.label, MenuItems)

このインスタンスには、 getViewメソッドの独自の実装が既にあります。したがって、getView をオーバーライドする場合、自分で完全な実装を提供し、ビューをコンテンツで埋めるためのすべての責任を負うことは明らかです。そのため、何か新しいものを追加したい場合は、事前にsuper.getView()を呼び出してください。

しかし、あなたの場合、Image + text ビューがある場合、BaseAdapterを拡張し、すべての実装を自分で提供する必要があります。ArrayAdapter は単純な機能を提供し、それを拡張することは一般的ではありません。

于 2013-06-11T21:07:06.617 に答える