2013-06-05 20 views
5

ArrayAdapterを使用して、無限のスクロール機能でListViewにデータを設定しています。 ListViewの行にImageViewと2つのTextViewがあります。最初はListViewを10個のアイテムで読み込み、スクロールダウンしてsetonscrolllistenerのWebサービスを呼び出し、次の10個のアイテムをListViewにロードします。 Arraylistに新しい項目が追加されたら、adapter.notifysetdatachangedを呼び出して、アダプタにListViewをリフレッシュするように指示します。新しい項目が追加されたときにListViewがちらつく

新しいアイテムがListViewに追加されるたびにListView全体が更新され、既にロードされているListViewのイメージが点滅します。はい、私はディスクとメモリの両方のすべてのイメージをキャッシュしています。コードはキャッシュを非常にスムーズに行います。

このadapter.addall(myarraylist)を使用してアダプタにデータを追加しようとしましたが、役に立たなかった。 ImageViewsはまだ点滅しています。私はStackOverflow上でそれについて多くを検索し、あなたが追加することはできませんし、ListView全体をリフレッシュせずに、ListViewでより多くの項目を表示することができます。私はすでに知っているが、既に読み込まれたデータをリフレッシュするのではなく、ListViewに新しいデータを追加するための何らかの方法が必要である。

このようにアダプタを設定しています。

public View getView(int position, View view, ViewGroup parent) 
     { 

     int main = R.layout.layout; 
     ViewHolder holder = null; 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (view == null) { 

      holder = new ViewHolder(); 
      view = inflater.inflate(main, null); 
      holder.image = (ImageView) convertView.findViewById(R.id.imageview); 

      ///More stuff 

      view.setTag(holder); 
     } else { 
      holder = (ViewHolder)view.getTag(); 
     } 

     // Loading ImageViews by Urls 

     return view; 
    } 

誰でもそれを見てください。

+0

正確にはわかりませんが、これは関連している可能性があります。 http://stackoverflow.com/questions/13322575/android-visible-listview-images-flicker-when-adding-data-to-arrayadapter – Zerkz

+0

これを試すhttps://github.com/commonsguy/cwac-endless –

+0

ビューにイメージをロードする方法を示しますか?乾杯。 – asheinfeld

答えて

2

正しい方法でやっているようですので、imageLoaderの問題かもしれません。 URLが同じであれば、イメージビューに画像を再設定しないでください。

imageViewでsetTag (url)メソッドを使用し、URLが変更されているかどうかをテストできます。

希望すると、これが役立ちます。

+2

ユニバーサルイメージローダーの問題ですね。別のライブラリを使用して問題が解決しないかどうか教えてください。返信いただきありがとうございます。 –

+1

私の場合、イメージローダーの問題でした。コードが同じ画像をダウンロードしようとしているかどうかを確認したらすぐに、フリッカー効果が消えてしまいました。 – Bobrovsky

1

解決策は、画像が変更されなかったときに画像を再読み込みしないことです。お使いのアダプタで

はgetViewメソッド()を実行します。成功時に

// schedule rendering: 
final String path = ... (set path here); 
if (holder.lastImageUrl == null || !holder.lastImageUrl.equals(path) 
       || holder.headerImageView.getDrawable() == null) { 
    // refresh image 
    imageLoader.displayImage(imageUri, imageAware); 
} else { 
    // do nothing, image did not change and does not need to be updated 
} 

を(ImageLoadingListenerを追加する)あなたはholder.lastImageUrl =パスを設定し、それを再ロードするように、あなたはnullにholder.lastImageUrlを設定し失敗し、キャンセルに次回。

関連する問題