RxTextView.textChanges注意事项

问题:当执行subscribe进行订阅时则会执行一次Log.i,尽管myTextView此时为进行任何赋值操作,这显然不是我们想要的当文本发生改变时才进行通知

RxTextView.textChanges(myTextView).subscribe{ charSequence -> Log.i("aa", "*******$charSequence")}

解决:既然没有简单的方法不让它订阅时不通知,我们可以通过标识来控制是否执行我们的业务

var isFirst = true
RxTextView.textChanges(myTextView)
     .subscribe{ charSequence -> 
        if(!isFirst){
            Log.e("aa", "*******$charSequence")
        }else{
           isFirst = false
        }       
     }

备注:

(1)RxTextView.textChanges监听的是onTextChanged

(2)可以通过标志位来控制EditextView,执行setText时不处理通知,输入时才处理

var canPrint = false
RxTextView.textChanges(myEditextView)
     .subscribe{ charSequence -> 
        if(canPrint){
            Log.e("aa", "*******$charSequence")
        }else{
           canPrint = true
        }       
     }

canPrint = false
myEditextView.setText("123456")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于RxJava实现搜索框关键词匹配的demo代码,它可以实现在输入关键词时实时显示匹配的结果: ```java public class SearchActivity extends AppCompatActivity { private EditText etSearch; private RecyclerView rvResult; private SearchAdapter adapter; private List<String> dataList = new ArrayList<>(); private Subscription subscription; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); etSearch = findViewById(R.id.et_search); rvResult = findViewById(R.id.rv_result); adapter = new SearchAdapter(this, dataList); rvResult.setLayoutManager(new LinearLayoutManager(this)); rvResult.setAdapter(adapter); subscription = RxTextView.textChanges(etSearch) .debounce(500, TimeUnit.MILLISECONDS) .map(CharSequence::toString) .observeOn(Schedulers.io()) .flatMap(this::search) .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::updateResult); } private Observable<List<String>> search(String keyword) { return Observable.create(subscriber -> { List<String> result = new ArrayList<>(); // 模拟搜索过程 for (int i = 0; i < 10; i++) { if (String.valueOf(i).contains(keyword)) { result.add(String.valueOf(i)); } } subscriber.onNext(result); subscriber.onCompleted(); }); } private void updateResult(List<String> result) { dataList.clear(); dataList.addAll(result); adapter.notifyDataSetChanged(); } @Override protected void onDestroy() { super.onDestroy(); if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } } } ``` 这个demo中使用了RxTextView来监听EditText的文本变化,然后通过debounce操作符来限制搜索频率,避免频繁地进行搜索。接下来使用map操作符将CharSequence转换为String,然后在io线程中进行搜索,最后通过observeOn(AndroidSchedulers.mainThread())将结果回到主线程中进行更新。在search方法中,我们使用Observable.create方法来创建一个Observable对象,并在其中进行模拟搜索过程。最后在updateResult方法中更新搜索结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值