【问题标题】:Observe text changes and filter list using RxAndroid使用 RxAndroid 观察文本变化和过滤列表
【发布时间】:2016-04-03 09:05:40
【问题描述】:

观察 EditText 上的文本变化 -

RxTextView.textChangeEvents(editText)
   .subscribe(e -> log(e.text().toString()));

并过滤列表 -

Observable.from(itemList)
                .filter(item-> item.getName().toLowerCase().contains(search.toLowerCase()))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Item>() {
                    @Override
                    public void onCompleted() {
                        Utils.crossfade(mProgressView, recyclerHotelOption);
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Item item) {
                        if (mItemListAdapter == null) {
                            List<Item> itemList = new ArrayList<>();
                            itemList.add(item);
                            mItemListAdapter = new ItemListAdapter(mActivity, itemList);
                            recyclerHotelOption.setAdapter(mItemListAdapter);
                            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mActivity);
                            linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);                           
                            recyclerHotelOption.setLayoutManager(linearLayoutManager);
                        } else {
                            mItemListAdapter.notifyDataSetChanged(item);
                            recyclerHotelOption.getLayoutManager().scrollToPosition(0);
                        }
                    }
                });

如何结合两者来过滤固定的项目列表?

更新

我根据答案更改了代码,但仍然无法正常工作。

RxSearchView.queryTextChangeEvents(mSearchView)
            .map(textViewTextChangeEvent -> textViewTextChangeEvent.toString().toLowerCase())
            .switchMap(s -> Observable.from(items)
                    .filter(item-> item.getItemName().toLowerCase().contains(s.toLowerCase()))
                    .toList()).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<List<Item>>() {
                @Override
                public void onCompleted() {
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(List<Item> items) {
                    mItemListAdapter.notifyDataSetChanged(items);
                    recyclerView.getLayoutManager().scrollToPosition(0);
                }
            });

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    我会这样做:

    Observable<CharSequence> textChanges = RxTextView.textChangeEvents(editText);
    textChanges
        .map(search -> search.toString().toLowerCase())
        .switchMap(search ->
          Observable.from(itemList)
              .filter(item -> item.getName().toLowerCase().contains(search))
              .toList()
        )
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(
            new Observer<List<Item>>() {
              // ...
            });
    

    【讨论】:

    • 您能否根据您的回答查看更新后的代码。它仍然无法正常工作。
    • 列表未根据SearchView 中的文本更改进行过滤。
    • mItemListAdapter.notifyDataSetChanged(items); 是做什么的?
    • 更改适配器内的底层数据。
    • 它是否调用notifyDataSetChanged()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2018-01-29
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多