1

ImageViewのサイズを再設定しようとしています。カスタムアダプタを使用しています。

View row = convertView;
if (row == null) {
    LayoutInflater inflater =  (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.grid_item, null);
}

thumb = (ImageView) row.findViewById(R.id.bookThumb);

ImageViewを使用する場合thumb=(ImageView)row.findViewById(R.id.bookThumb); カスタムアダプタ内ではうまく機能しますが、すべての行をループしているため、スクロールが非常に遅くなります。

だから...私は今thumb=(ImageView)row.findViewById(R.id.bookThumb);を取得しようとしています。メインアクティビティからサイズを設定しましたが、Nullが発生したため、アプリの強制が終了します。

試した:

LinearLayout layout = (LinearLayout) findViewById(R.id.gridLayout);
ImageView thumbRow = (ImageView)layout.findViewById(R.id.bookThumb);

また試した:

// gv is the gridview (R.id.gridview)
ImageView thumbRow = (ImageView)gv.findViewById(R.id.bookThumb);

常にnullを取得します。

助けに感謝します!私は愚かな何かを逃しているように感じます:)

4

1 に答える 1

3

問題は2か所にあると思います。

まず、元の問題から始めます。findViewById呼び出しが原因で、アダプタの速度が低下しています。リサイクルされたビューを利用します。これはすばらしいことですが、それでもサムネイルのビューをトラバースします。非公式にViewHolderと呼ばれる手法があり、基本的には直接呼び出しになります。

したがって、データの入力を開始する場所としてリサイクルビューを使用するだけでなく、操作する要素をプリフェッチできるように、構造をアタッチすることもできます。

if (row == null) {
    LayoutInflater inflater =  (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    row = inflater.inflate(R.layout.grid_item, null);
    row.setTag(row.findViewById(R.id.bookThumb));

}

thumb = (ImageView) row.getTag();

ここでは、変数によって直接呼び出し、トラバースは実行されません。これははるかに高速であるはずです。

また、2番目の問題であるNullPointerExcepton。

これは、メインアクティビティでfindViewByIdを呼び出すポイントと混合されたIDのあいまいさだと思います。特に、アダプタビュー内でレンダリングするための呼び出しをインターセプトする必要があるため、スクロールが含まれている場合は、mainActivityでそれを実際にうまく行うことはできません。ほとんどのコールバックはすでにメインスレッド上にあるため、そのスレッド上で2つのことが同時に発生することはありません。

したがって、findViewById()を呼び出した時点では、アダプターはまだ実行されておらず、そのビューを階層にアタッチしていない可能性があります。もしそうなら、それはまだそれを操作し終えていないかもしれません。

アダプタービューの使用を完全に放棄せずに安全または正確に実行できるかどうかさえわからないため、2番目の問題に取り組む前にアダプターの速度を上げようとします。

于 2011-03-20T18:14:01.823 に答える