2016-07-18 6 views
1

RecyclerViewのデータをバインドするためにandroid.support.v7.util.SortedListを使用しています。データを更新しようとすると、は常に-1を返します。android.support.v7.util.SortedListのバイナリ検索

private int findItem(ZoneContactLoaderAdapter mAdapter, ContactModel contactModel) { 

//  int index = Collections.binarySearch(mAdapter.getContactModel(), contactModel, new BinarySearchWithComparator()); 
     return mAdapter.getContactModel().indexOf(contactModel); 
    } 

ロジックはこのようなものです:

int position = findItem(zoneContactLoaderAdapter, notificationContactModel); 
if (position < 0) { 

         ContactModel adapterContactModel = new ContactModel(conversationID, Constants.ACCOUNT_TYPE, conversationName, "", null, conversationName, conversationID, false); 
         updateAdapterModel(adapterContactModel, notificationContactModel); 
         zoneContactLoaderAdapter.getContactModel().add(adapterContactModel); 

        } else { 
         notificationContactModel.setIsConversation(true); 
         ContactModel adapterContactModel = zoneContactLoaderAdapter.getItem(position); 
         updateAdapterModel(adapterContactModel, notificationContactModel); 
         zoneContactLoaderAdapter.getContactModel().updateItemAt(position, adapterContactModel); 
        } 

位置は常に-1を返し、データを複製します。 threadから解決策を試しましたが、それでも正常に動作しません。だから、例としてthisを使ってリスト自体にカスタムバイナリ検索を実装することを考えました。しかしコレクションはListだけを取る。

android.support.v7.util.SortedListでアイテムのインデックスを見つけるにはどうすればよいでしょうか。ありがとう

答えて

3

SortedListのindexOfメソッドは、含まれているオブジェクトのhashCode()メソッドとequals()メソッドの適切な実装に大きく依存しています。

デフォルトのObject実装をそのままにしても、あなたの状況ではうまく動作しないことが保証されています。

自分で実装することもできます。Android Studioでメソッドを生成することもできますし、Project Lombokの@EqualsAndHashCodeアノテーションを使用してコンパイル時に生成することもできます。そこにはおそらく他のオプションもあります - これが最初に気になるものです。