2017-03-29 4 views
0

私はリストビューをSwipeRefreshLayoutでラップしています。リストビューは非常にスムーズにレンダリングされ、いつでも新しいデータで更新されます。しかし、新しいメッセージを取得するためにSwipeRefreshLayoutをプルダウンするたびに、リストビューはユーザの経験の点でマイナスの点滅効果を与えます。私はこの問題を解決する方法を教えてもらえますか?以下はAndroid SwipeRefreshLayout瞬きのリストビューをリフレッシュ

は、私のコードの一部です:

public void fetchMoreMsgs(){ 
    sizeOfChatLV=chatLVArray.size(); 
    if(lvPos==0){ 
     toast = Toast.makeText(ma,"No more messages",Toast.LENGTH_SHORT); 
     toast.setGravity(Gravity.CENTER,0,0); 
     toast.show(); 
     return; 
    }else { 
     if(lvPos-fetchStep>=0){ 
      arrayList = chatLVArray.subList(lvPos-fetchStep, lvPos); 
      msgsList.addAll(0, arrayList); 
      chatLVArrayAdapter = new ChatLVArrayAdapter(ma, msgsList); 
      ma.chatListViewIMP2P.setAdapter(chatLVArrayAdapter); 
      ma.chatListViewIMP2P.setSelection(fetchStep); 
      lvPos-=fetchStep; 
     }else { 
      arrayList = chatLVArray.subList(0, lvPos); 
      msgsList.addAll(0, arrayList); 
      chatLVArrayAdapter = new ChatLVArrayAdapter(ma, msgsList); 
      ma.chatListViewIMP2P.setAdapter(chatLVArrayAdapter); 
      ma.chatListViewIMP2P.setSelection(lvPos); 
      lvPos=0; 
     } 
    } 
} 

私は(SwipeRefreshLayoutに包まれた)リストビューをプルダウンするときfetchMoreMsgsメソッドが呼び出されると、.ANYのヘルプははるかに高く評価されます!

答えて

1

setAdapterを呼び出すと、ListViewのすべてのビューが完全に破棄され、新しいビューが作成されます。これがあなたの瞬きの原因となります。

代わりに、chatLVArrayAdapterには下位のリストを更新する方法があり、アダプタのnotifyDataSetChanged()を呼び出してListViewにデータが変更されたことを通知する必要があります。

+0

私はnotifyDataSetChanged()を後で試します。これはより効率的です。しかし、SwipeRefreshLayoutの関与がない限り、他の状況ではsetAdapterは点滅効果を生成しません。これは、ViewListenerを使用しないArrayAdapterの実装によって引き起こされる可能性があります(私のリストは2種類の行を取りますが、ViewHolderに配置する方法はわかりません)。しかし、リストビューが他のケースでは点滅しない理由を説明することはまだ難しいです。 ます。public void onRefresh(){ 新しいスレッド(新しいRunnableを(){ @Override ます。public void実行(){ runOnUiThread(新しいRunnableを(){ ます。public void: – user1870797

+0

は、私はこのようになります醜いソリューションを思いつきました実行(){ p2PTalkView.fetchMoreMsgs(); p2pSwipeRFL.setRefreshing(false); }}); }})。start(); } – user1870797

+0

点滅は消えていますが、なぜ私はわかりません – user1870797

関連する問題