2017-08-16 61 views
0

当我启动Android应用程序时,登录到Realm Object Server并从Realm Server Object下载(同步)数据。好的。 现在我到了显示人员列表的片段。远程领域(在领域对象服务器上)发生变化时不通知片段

下面的代码:

public class PersonsFragment extends Fragment { 
    private ListView notEmptytsListView; 
    private Realm realm; 
    private RealmResults<Person> personsRealmResults; 
    private PersonsAdapter personsAdapter; // RealmBaseAdapter<Organization> 
    private RealmChangeListener realmChangeListener; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.persons_fragment, container, false); 
     init(rootView); 
     return rootView; 
    } 

    private void init(View view) { 
     realm = Realm.getDefaultInstance(); 
     notEmptytsListView = (ListView) view.findViewById(R.id.notEmptytsListView); 
     personsRealmResults = realm.where(Person.class).findAllSorted(Person.NAME); 
     personsAdapter = new PersonsAdapter(personsRealmResults); 
     notEmptytsListView.setAdapter(personsAdapter); 

     // NOT CALL WHEN DATA ON REALM OBJECT SERVER WAS CHANGED 
     realmChangeListener = new RealmChangeListener() { 
      @Override 
      public void onChange(Object object) { 
       personsAdapter.notifyDataSetChanged(); 
      } 
     }; 
     personsRealmResults.addChangeListener(realmChangeListener); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     realm.removeChangeListener(realmChangeListener); 
     realm.close(); 
    } 
} 

如果我留在片段和数据变化领域对象服务器(远程域)的本地数据不同步的。不调用方法onChanged()。

我该如何解决这个问题?

+0

您的部分代码未格式化,请进行校对。 – SteveFest

+0

您需要将RealmResults存储为字段变量,而不仅仅是局部变量。 – EpicPandaForce

回答

0
public class MyFragment extends Fragment {  
    RealmResults<Person> personsRealmResults; // <-- 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.persons_fragment, container, false); 
     notEmptytsListView = (ListView) view.findViewById(R.id.notEmptytsListView); 

     realm = Realm.getDefaultInstance(); 
     personsRealmResults = realm.where(Person.class).findAllSorted(Person.NAME); 
     personsAdapter = new PersonsAdapter(personsRealmResults); 
     notEmptytsListView.setAdapter(personsAdapter); 

     realmChangeListener = new RealmChangeListener() { 
      @Override 
      public void onChange(Object object) { 
       // call when data on Realm Object Server was changed 
     } 
     }; 
     personsRealmResults.addChangeListener(realmChangeListener); 
     return rootView; 
    } 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     realm.removeChangeListener(realmChangeListener); 
     realm.close(); 
    } 
} 

虽然它很可能更容易,如果PersonsAdapter是一个RealmBaseAdapter。 (请参阅docs

+0

是的。在这里我的适配器:'公共类PersonssAdapter扩展RealmBaseAdapter implements ListsAdapter' – lmdic

+0

没有帮助。同样的结果。不打* onChange()*。在发布后查看我的更新代码。只有在重新启动应用程序后,数据才会更改。 – lmdic

+0

上面的代码应该可以工作,所以其他的东西一定是不对的。您是否100%下载了更改? –