1

たとえば、ギャラリーなどのリストを最適化する方法について多くのチュートリアルに従ってきましたが、アダプターでビューを再利用できません。これが私のコードです:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("ImageAdapter","getView : "+convertView);
    ImageView imageView = null;

    if (convertView == null){
        //imageView = (ImageView) mInflater.inflate(R.layout.pic_adapter, null);
        imageView = new ImageView(context);


        holder = new ViewHolder();
        holder.imageView = imageView;

        imageView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
        //imageView = holder.imageView;
    }

    holder.imageView.setImageDrawable(plotsImages.get(position));
    Log.d("ImageAdapter","return : "+imageView);
    return imageView;
}

私のログでは、getView の最初に常に「null」が表示されます。これは、convertView が再循環されたビューではないことを意味します。

助けてくれてありがとう!

4

2 に答える 2

1

ViewHolder で使用する循環ロジックが原因だと思います。あなたのコードを実行しようとすると、あいまいなエラーでアプリがクラッシュしました。ただし、これは正常に機能します。

public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("ImageAdapter","getView : "+convertView);
    ImageView imageView = null;

    if (convertView == null){
        //imageView = (ImageView) mInflater.inflate(R.layout.pic_adapter, null);
        imageView = new ImageView(Example.this);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageDrawable(plotsImages.get(position));
    Log.d("ImageAdapter","return : "+imageView);
    return imageView;
}

ViewHolders はfindViewById()、行レイアウトで子ビューにアクセスするために繰り返し使用することからあなたを救うはずです。レイアウトは単なる ImageView であるため、ViewHolder は必要ありません。

于 2012-10-30T19:48:31.903 に答える
0

最初にホルダーを取り除きます。convertView で得られるものは、getView() から返されるものです。それはあなたのコードでも期待されていることですが、なぜそのような不必要な複雑さがあるのでしょうか?

どのアダプタークラスを使用していますか? BaseAdapter を試して、オーバーライドされたすべてのメソッドが適切なデータを返すことを確認できますか?

私はgetItemViewTypeを考えています。毎回異なる値を返すと、リサイクルが無効になります。

于 2013-03-21T08:48:50.380 に答える