Java 在RealmRecyclServiceAdapter上调用updateData实际上并没有更新数据
我试图使用SearchView来过滤RealmRecyclServiceAdapter提供的列表。我在StackOverflow上尝试了以下几点建议: 无济于事。当我到达这里:updateData(新领域查询)时,什么都没有发生 这是我的密码。我从Lucas Urbas的材料主/细节案例研究开始,并开始添加一些东西来帮助自己学习如何使用。在PeopleFragment中,我修改了setUpToolbar和setUpRecyclerView方法,如下所示:Java 在RealmRecyclServiceAdapter上调用updateData实际上并没有更新数据,java,android,realm,Java,Android,Realm,我试图使用SearchView来过滤RealmRecyclServiceAdapter提供的列表。我在StackOverflow上尝试了以下几点建议: 无济于事。当我到达这里:updateData(新领域查询)时,什么都没有发生 这是我的密码。我从Lucas Urbas的材料主/细节案例研究开始,并开始添加一些东西来帮助自己学习如何使用。在PeopleFragment中,我修改了setUpToolbar和setUpRecyclerView方法,如下所示: private void setUpT
private void setUpToolbar() {
if (DEBUG) Log.i(TAG, "Reached setUpToolbar") ;
CustomAppBar appBar = ((MainActivity) getActivity()).getCustomAppBar() ;
appBar.setTitle(getString(R.string.fragment_people__title)) ;
appBar.setMenuRes(R.menu.people_general, R.menu.people_specific, R.menu.people_merged) ;
// Set up search
searchItem = appBar.getToolbarSpecific().getMenu().findItem(R.id.menu_people__search) ;
searchView = (SearchView) searchItem.getActionView() ;
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
if(DEBUG) Log.i(TAG, "Reached onQueryTextSubmit") ;
adapter.updateData(realm.where(Person.class).equalTo("userId", userid).contains("name", query).findAll()) ;
return true ;
//return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if(DEBUG) Log.i(TAG, "Reached onQueryTextChange") ;
adapter.updateData(realm.where(Person.class).equalTo("userId", userid).contains("name", newText).findAll()) ;
return true ;
//return false;
}
}) ;
// Set up menu item click listener
appBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (DEBUG) Log.i(TAG, "Reached onMenuItemClick") ;
// handle selection of action bar items
switch (item.getItemId()) {
case R.id.menu_people__add:
presenter.clickAddPerson() ;
return true ;
case R.id.menu_people__search:
return true ;
case R.id.menu_people__settings:
presenter.clickSettings() ;
return true ;
case R.id.menu_people__logout:
sessionManager.logoutUser() ;
return true ;
}
return false ;
}
}) ;
} // end of setUpToolbar method
private void setUpRecyclerView() {
if (DEBUG) Log.i(TAG, "Reached setUpRecyclerView") ;
recyclerView.setHasFixedSize(true) ;
final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()) ;
layoutManager.setOrientation(LinearLayoutManager.VERTICAL) ;
recyclerView.setLayoutManager(layoutManager) ;
recyclerView.setEmptyView(emptyView) ;
adapter = new PeopleAdapter(realm.where(Person.class).equalTo("userId", userid).findAll()) ;
adapter.setOnPersonClickListener(new PersonView.OnPersonClickListener() {
@Override
public void onPersonClick(Person person) {
presenter.clickPerson(person) ;
}
@Override
public void onPersonActionClick(final Person person) {
presenter.clickPersonAction(person) ;
// ToDo: this should be in the presenter, but I don't have realm in there yet
final Person newFave = realm.where(Person.class)
.equalTo("id", person.getId())
.findFirst() ;
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
newFave.setIsFavorite(!person.getIsFavorite()) ;
}
}) ;
}
}) ;
recyclerView.setAdapter(adapter) ;
} // end of setUpRecyclerView method
以下是大多数人的回答:
class PeopleAdapter
extends RealmRecyclerViewAdapter<Person, PeopleAdapter.PersonViewHolder> {
private final String TAG = "PeopleAdapter" ;
private final boolean DEBUG = true ;
private OrderedRealmCollection<Person> peopleList ;
private PersonView.OnPersonClickListener onPersonClickListener ;
static class PersonViewHolder extends RecyclerView.ViewHolder{
PersonView personView ;
PersonViewHolder(PersonView personView) {
super(personView) ;
this.personView = personView ;
}
} // end of PersonViewHolder class
// Constructor
PeopleAdapter(OrderedRealmCollection<Person> data) {
super(data, true, true) ; // data, autoUpdate, updateOnModification
setHasStableIds(true) ;
this.peopleList = data ;
}
void setOnPersonClickListener(PersonView.OnPersonClickListener onPersonClickListener) {
this.onPersonClickListener = onPersonClickListener ;
}
@Override
public PeopleAdapter.PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
PersonView view = (PersonView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_view_person, parent, false) ;
return new PersonViewHolder(view) ;
}
@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {
holder.personView.setUser(peopleList.get(position)) ;
holder.personView.setOnPersonClickListener(onPersonClickListener) ;
}
@Override
public int getItemCount() {
// If the peopleList is null, return 0, otherwise return the number of items in the list
return peopleList == null ? 0 : peopleList.size() ;
}
class-apter
扩展RealmRecyclServiceAdapter{
私有最终字符串标记=“PeoConceapter”;
私有最终布尔调试=true;
私有OrderedRealmCollection人员列表;
private PersonView.OnPersonClickListener OnPersonClickListener;
静态类PersonViewHolder扩展了RecyclerView.ViewHolder{
个人观点;
PersonViewHolder(PersonView PersonView){
超级(personView);
this.personView=personView;
}
}//PersonViewHolder类结束
//建造师
PeoConceCapter(OrderedRealmCollection数据){
super(数据,真,真);//数据,自动更新,更新修改
setHasStableIds(true);
this.peopleList=数据;
}
void setOnPersonClickListener(PersonView.OnPersonClickListener-OnPersonClickListener){
this.onPersonClickListener=onPersonClickListener;
}
@凌驾
public PeoponCapter.PersonViewHolder onCreateViewHolder(视图组父级,int-viewType){
PersonView视图=(PersonView)LayoutFlater.from(parent.getContext())
.充气(R.layout.item\u view\u person,parent,false);
返回新的PersonViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(PersonViewHolder,内部位置){
holder.personView.setUser(peopleList.get(position));
holder.personView.setOnPersonClickListener(onPersonClickListener);
}
@凌驾
public int getItemCount(){
//如果peopleList为null,则返回0,否则返回列表中的项目数
返回peopleList==null?0:peopleList.size();
}
我到处都有日志消息,但为了便于阅读,我把大部分日志消息都取出来了。基本上,无论我是这样尝试,还是用适配器实现filterable,它都可以直接访问updateData方法,而不会崩溃、抛出异常或指示任何问题,但它什么也不做。出现SearchView,文本被输入并成为新查询的一部分,查询被移交给updateData,而…什么都没有
Realm插件4.2.0、AndroidStudio 2.3.3、target sdk 25、运行Android 7.0的三星Galaxy S2
我希望有人能帮上忙,因为我尝试了像我这样的问题的答案,我很困惑。
谢谢如果RealmRecyclServiceAdapter中没有
人员列表
变量,请使用getData()
编辑:这是适配器的外观:
class PeopleAdapter
extends RealmRecyclerViewAdapter<Person, PeopleAdapter.PersonViewHolder> {
private final String TAG = "PeopleAdapter" ;
private final boolean DEBUG = true ;
private PersonView.OnPersonClickListener onPersonClickListener ;
static class PersonViewHolder extends RecyclerView.ViewHolder{
PersonView personView ;
PersonViewHolder(PersonView personView) {
super(personView) ;
this.personView = personView ;
}
} // end of PersonViewHolder class
// Constructor
PeopleAdapter(OrderedRealmCollection<Person> data) {
super(data, true, true) ; // data, autoUpdate, updateOnModification
}
void setOnPersonClickListener(PersonView.OnPersonClickListener onPersonClickListener) {
this.onPersonClickListener = onPersonClickListener ;
}
@Override
public PeopleAdapter.PersonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
PersonView view = (PersonView) LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_view_person, parent, false) ;
return new PersonViewHolder(view) ;
}
@Override
public void onBindViewHolder(PersonViewHolder holder, int position) {
holder.personView.setOnPersonClickListener(onPersonClickListener) ;
holder.personView.setUser(getData().get(position)) ;
}
}
class-apter
扩展RealmRecyclServiceAdapter{
私有最终字符串标记=“PeoConceapter”;
私有最终布尔调试=true;
private PersonView.OnPersonClickListener OnPersonClickListener;
静态类PersonViewHolder扩展了RecyclerView.ViewHolder{
个人观点;
PersonViewHolder(PersonView PersonView){
超级(personView);
this.personView=personView;
}
}//PersonViewHolder类结束
//建造师
PeoConceCapter(OrderedRealmCollection数据){
super(数据,真,真);//数据,自动更新,更新修改
}
void setOnPersonClickListener(PersonView.OnPersonClickListener-OnPersonClickListener){
this.onPersonClickListener=onPersonClickListener;
}
@凌驾
public PeoponCapter.PersonViewHolder onCreateViewHolder(视图组父级,int-viewType){
PersonView视图=(PersonView)LayoutFlater.from(parent.getContext())
.充气(R.layout.item\u view\u person,parent,false);
返回新的PersonViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(PersonViewHolder,内部位置){
holder.personView.setOnPersonClickListener(onPersonClickListener);
holder.personView.setUser(getData().get(position));
}
}
谢谢您的回复,@EpicPandaForce,但我不太明白您要我做什么。我是Android编程新手。当我使用holder.personView.setPerson(getData().get(position))时;我在E/REALM_JNI:JNI:ThrowingException 2中崩溃,超出范围再次感谢您的帮助。更新的答案..您不应该超出范围。再次感谢您,@EpicPandaForce。它很有效!当我在您最初的响应后使用getData时,我遇到了“超出范围”崩溃。这次,我可以看出您没有使用“setHasStableIds(true)”行,所以当我取出它时,我不再得到崩溃。再次感谢!