【问题标题】:Invoking updateData on a RealmRecyclerViewAdapter is not actually updating the data在 RealmRecyclerViewAdapter 上调用 updateData 实际上并没有更新数据
【发布时间】:2017-11-21 00:14:24
【问题描述】:

我正在尝试使用 SearchView 过滤由 RealmRecyclerViewAdapter 提供的列表。我在 StackOverflow 上尝试了这里建议的几件事,包括: EpicPandaForce's suggestion

无济于事。当我到达这里:updateData(新领域查询)时,什么也没有发生。

这是我的代码。我从 Lucas Urbas 的 Material Master/Detail Case Study 开始,然后开始添加一些东西来帮助自己学习如何做。在 PeopleFragment 中,我修改了 setUpToolbar 和 setUpRecyclerView 方法,如下所示:

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

这里是 PeopleAdapter 的大部分内容:

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() ;
}

我到处都有日志消息,但我把它们中的大部分都去掉了,以便于阅读。基本上,无论我以这种方式尝试,还是使用实现可过滤的适配器尝试,它都可以直接使用 updateData 方法,而不会崩溃、抛出异常或指示任何问题,但它什么也没做。 SearchView 出现,文本被输入并成为新查询的一部分,查询被移交给 updateData,然后......什么都没有。

Realm 插件 4.2.0、AndroidStudio 2.3.3、目标 sdk 25、运行 Android 7.0 的三星 Galaxy S2

我希望有人可以提供帮助,因为我尝试了已经针对我的问题给出的答案,但我很困惑。 谢谢

【问题讨论】:

    标签: java android realm


    【解决方案1】:

    在你的 RealmRecyclerViewAdapter 中没有 peopleList 变量,使用 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)) ;
        }
    }
    

    【讨论】:

    • 感谢您的回复,@EpicPandaForce,但我不太明白您要我做什么。我是 Android 编程新手。当我使用 holder.personView.setPerson(getData().get(position)) 时;我遇到了 E/REALM_JNI 崩溃:jni: ThrowingException 2, Out of range 再次感谢您的帮助。
    • 已更新答案.. 不过,您不应该超出范围。
    • 再次感谢您,@EpicPandaForce。有用!当我在您的原始回复后使用 getData 时,我遇到了“超出范围”崩溃。这一次,我可以看到你没有使用“setHasStableIds(true)”行,所以当我把它拿出来时,我不再遇到崩溃。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 2011-02-16
    • 2010-10-19
    • 2016-12-30
    • 2012-11-22
    相关资源
    最近更新 更多