2016-06-23 1 views
2

私はRealmテーブルにリンクされたリストビューを作成しようとしています。そのため、アイテムがテーブルに追加されると、リストビューを更新する必要があります。問題は、項目が追加されたときにRealmChangeListenerが呼び出されないことです。RealmChangeListenerが呼び出されていない

Realm real = RealmController.getInstance(getContext()); // Singleton 
RealmResults<Friend> friends = real.where(Friend.class).findAllAsync(); 
friends.addChangeListener(callback); 

RealmChangeListener<RealmResults<Friend>> callback=new RealmChangeListener<RealmResults<Friend>>() { 
    @Override 
    public void onChange(RealmResults<Friend> element) { 
     // This is only called on async completed but not later 
    } 
}; 

保存処理はretrotif応答で行われます。

new MyService(context).userService().getFriends().enqueue(new Callback<FriendResponse>() { 
     @Override 
     public void onResponse(Call<FriendResponse> call, Response<FriendResponse> response) { 
      Realm realm = RealmController.getInstance(context); // singleton 
      realm.beginTransaction(); 
      realm.copyToRealmOrUpdate(response.body().friends); 
      realm.commitTransaction(); 
     } 

     @Override 
     public void onFailure(Call<AllInfoResponse> call, Throwable t) { 

     } 
    }); 

あなたは何が起こっているか知っていますか?なにか提案を?

+2

UIスレッドでレルムを閉じた場合、またはRealmResultsがGCされた場合は、changelistenerは呼び出されません。 –

+0

私はcloseを呼ぶことはありません。実際、シングルトンはライブインスタンスを取得するのに役立ちます。だから私は友人がGC'edであることを納得させる、私はクラスの貢献としてそれを入れようとします –

+1

@ChristianMelchior、私はRealmResultsを入れました友人;クラス属性としてそれは動作します!あなたが解決策としてそれを書いたら、私はそれを正しいものとしてマークします。 –

答えて

1

あなたの正確な状況(RetrofitコールとUIはRealmChangeListenerでリフレッシュされました)にいくつかの問題が発生しましたが、新しい質問を投稿しようとしていましたが、私の場合は

、私は私が見つけた、私のArrayAdapterRealmChangeListenerを実装クリーナー:

public class ListAdapter extends ArrayAdapter<Item> implements 
     RealmChangeListener<RealmResults<Item>> { 

    private final List<Item> items; 

    public ListAdapter(Context context, RealmResults<Item> items) { 
     super(context, R.layout.listitem_item); 
     this.items = items; 
     items.addChangeListener(this); 
    } 

    @Override 
    public void onChange(RealmResults<Restaurant> element) { 
     notifyDataSetChanged(); 
    } 

    ... 
} 

別の状況が、私はビューを初期化し、何とか活動のonCreateとの私のRetrofitサービスを呼び出していましたリスナーは応答を受信する前に添付されていませんでした。だから、私がやったもう1つの方法は、​​メソッドでRetrofitメソッドを呼び出すことで、リスナーの準備が整っていることを確認することでした。

public class ItemListActivity BaseActivity implements 
     RealmChangeListener<RealmResults<Item>>, 
     Callback<GetItemsResponse> { 

    private long id; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_item_list); 

     RealmResults<Item> items = getRealm() 
       .where(Item.class) 
       .findAll(); 

     items.addChangeListener(this); 

     setupUI(items); 
    } 

    @Override 
    protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 

     MyRetrofitClient 
       .getInstance(this) 
       .getItems() 
       .enqueue(this); 
    } 

    @Override 
    public void onResponse(Call<GetItemsResponse> call, final Response<GetItemsResponse> response) { 
     getRealm().executeTransaction(new Realm.Transaction() { 
      @Override 
      public void execute(Realm realm) { 
       List<Item> newItems = response.body().getNewItems(); 
       realm.copyToRealmOrUpdate(newItems); 
      } 
     }); 
    } 

    @Override 
    public void onChange(RealmResults<Item> items) { 
     updateUI(); 
    } 

    ... 
} 

これが役立ちます。

関連する問題