グリッドビューがあります。10枚の画像の配列から画像を表示しています。1分後、さらに5つの画像を追加します。グリッドビューを更新するには、次のコードを使用しています。
aImgAdapterL.notifyDataSetChanged();
aImgAdapterLは私のImgaeAdapterです。新しい画像が表示されます。
私の問題は、画像の更新中に発生するグリッドビューの1つのちらつきまたは点滅を更新するときです。そのちらつきを隠すことは可能ですか?
グリッドビューがあります。10枚の画像の配列から画像を表示しています。1分後、さらに5つの画像を追加します。グリッドビューを更新するには、次のコードを使用しています。
aImgAdapterL.notifyDataSetChanged();
aImgAdapterLは私のImgaeAdapterです。新しい画像が表示されます。
私の問題は、画像の更新中に発生するグリッドビューの1つのちらつきまたは点滅を更新するときです。そのちらつきを隠すことは可能ですか?
私は同じ問題を抱えていて、次のように解決できました:
実際、ListAdapter
リスト全体が更新されたときに適切に管理されていなかったのは私のせいでした。もしそうなら、あなたがしたいことは、すでに画面に表示されているアイテムをそのまま維持することです。
そのためにはgetView
、リサイクル アイテムを取得するときの Adapter のメソッドで、それが表示したいアイテムではないかどうかを確認する必要があります。その場合は直接ご返却ください。
@Override
public View getView(int position, View convertView, ViewGroup container) {
ImageView imageView;
String src = this.getItem(position).getSrcThumbnail();
if (convertView == null) {
imageView = new ImageView(getContext());
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120, getResources().getDisplayMetrics());
imageView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, height));
} else {
imageView = (ImageView) convertView;
// When you get a recycled item, check if it's not already the one you want to display.
String newSrc = (String) imageView.getTag();
if(newSrc.equals(src)){
// If so, return it directly.
return imageView;
}
}
loadBitmap(this.getItem(position).getSrcThumbnail(), imageView);
// Here you set the unique tag that allow to identify this item.
imageView.setTag(src);
return imageView;
}
UI の更新が重いため、ちらつきが発生します。アダプターの getview() で画像のトリミングなどの CPU を集中的に使用する機能を実行していることを確認してください。スレッド。
画像を表示する際にnostra13 の Universal Image Loaderを使用し、表示中にいくつかのアニメーションを設定します。
...DisplayImageOptions.displayer(FadeInBitmapDisplayer)...
簡単な解決策は1)新しいデータリストを古い配列リストに追加/リセットし、呼び出さないメソッドをアダプターに用意しnotifyDataSetChanged()
ます。ユーザーがスクロールするとgetviewが呼び出され、リストが更新されます。ちらつきません。
たとえば
// Have a method in adapter class
public void updateList(ArrayList<ABC> list) {
/
、ここにコードを入力してください`/古いものに追加 oldList.addAll(list); }
それだ`
ImageViewAware
実際のビュー サイズを考慮しない (ImageView の代わりに)パス: の代わりに:
imageLoader.displayImage(imageUri, imageView);
以下を実行します。
ImageAware imageAware = new ImageViewAware(imageView, false)
imageLoader.displayImage(imageUri, imageAware);
OpenGL とハードウェア アクセラレーションを有効にする必要があります。
<application android:hardwareAccelerated="true" ...>
<uses-feature
android:name="string"
android:required=["true" | "false"]
android:glEsVersion="integer" />
グリッドビューのアイテムでハードウェア キャッシュを使用することもできます。
view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
最後に、更新中にグリッド ビューをオーバーレイし、透明度で再生することができます。