RxBinding系列之RxTextView(二)

前言

  本篇一起来学习RxBinding中的RxTextView,J大神将Android中TextView的一些事件及动作加以RxJava的观察者模式并封装了起来就形成了RxTextView,使用起来也很简单。
  

textChange文本改变事件

textChanges

  RxTextView.textChanges(TextView view),内部封装了TextWatcher文本改变监听。

1
2
3
4
5
6
7
addDisposable(RxTextView.textChanges(etRxTextView)
.subscribe(new Consumer<CharSequence>() {
@Override
public void accept(CharSequence charSequence) throws Exception {
Log.e("rx_binding_test", "textChanges:文本改变了:" + charSequence.toString());
}
}));

textChangeEvents

  RxTextView.textChangeEvents(TextView view),内部同样封装了TextWatcher文本改变监听。不同的是其返回数据的类型为TextViewTextChangeEvent,内部包含详细的文本改变数据。为了简化代码,以下实例将使用Lambda表达式的形式。

1
2
3
4
5
6
addDisposable(RxTextView.textChangeEvents(etRxTextView)
.subscribe(textViewTextChangeEvent -> {
Log.e("rx_binding_test", "textChanges:文本改变了:" + "before:" + textViewTextChangeEvent.before() +
",start:" + textViewTextChangeEvent.start() + ",text:" + textViewTextChangeEvent.text() +
",count:" + textViewTextChangeEvent.count());
}));

实际场景

  在实际项目开发中经常会遇到搜索文本框需根据用户实时输入的文本进行检索,或去数据库查询,或去服务器请求检索。如果文本每改变一次都去检索的话会导致重复大量查数据库或请求服务器,很影响内存。来看下使用RxBinding如何解决这个问题。

1
2
3
4
5
6
7
8
9
10
addDisposable(RxTextView.textChanges(etRxTextView)
//限流时间500ms
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
//CharSequence转换为String
.map(CharSequence::toString)
.subscribe(s -> {
//这里可以查询数据库或请求服务器查询
Log.e("rx_binding_test", "textChanges:文本改变了:" + s);
}));

  正是由于RxBinding使用的是RxJava形式,所以RxJava中的操作符我们都可以使用。利用debounce操作符进行限流,就能避免因为用户输入速度过快导致多次请求服务器了。还可以利用map操作符将CharSequence转换为String再返回。Look,解决这个问题是不是So easy!

editorAction回车点击事件

editorActions

  RxTextView.editorActions(TextView view),内部封装了OnEditorActionListener软键盘回车点击监听。

1
2
3
4
addDisposable(RxTextView.editorActions(etRxTextView)
.subscribe(integer -> {
Log.e("rx_binding_test", "editorActions:输入完毕,点击回车:");
}));

editorActionEvents

  RxTextView.editorActionEvents(TextView view),内部同样封装了OnEditorActionListener软键盘回车点击监听。不同的是它的返回类型为TextViewEditorActionEvent,包含actionId,keyEvent等信息。

1
2
3
4
5
6
7
8
addDisposable(RxTextView.editorActionEvents(etRxTextView)
.subscribe(textViewEditorActionEvent -> {
KeyEvent keyEvent = textViewEditorActionEvent.keyEvent();
//判断up状态
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP) {
Log.e("rx_binding_test", "editorActionEvents:输入完毕,点击回车:" + textViewEditorActionEvent.keyEvent());
}
}));

  注意:KeyEvent包含down和up事件,所以会出现回调两次的问题。根据KeyEvent加入一种判断即可避免此问题。
  此外,RxTextView中还有beforeTextChangeEvents与afterTextChangeEvents,使用起来都差不多就不一一介绍了。

View操作

  RxTextView中还封装了一些常用的例如setText()setHint()setTextColor()等TextView的操作。使用起来也很简单,如下:

1
2
3
4
5
6
addDisposable(RxTextView.editorActions(etRxTextView)
.subscribe(integer -> {
RxTextView.text(etRxTextView).accept("LeiHolmes");
RxTextView.hint(etRxTextView).accept("请输入姓名");
RxTextView.color(etRxTextView).accept(Color.parseColor("#00ff00"));
}));

本文疑问

addDisposable()方法什么鬼?

飞机到本系列第一篇有讲解:
RxBinding系列之RxView(一)

Lambda表达式什么鬼?

飞机到我写的Lambda表达式教程:
Lambda表达式基本语法与应用

总结

  RxTextView中的内容不多,所以本篇篇幅较短,不要说我水啊,哈哈哈,我是觉得一种一种讲起来比较细致,建议码友们都上手敲一敲试一试啊。
  进阶中的码猿一枚,写的不对的地方欢迎大神们留言指正,有什么疑惑或者建议也可以在我Github上RxBindingDemo项目Issues中提出,我会及时回复。
  附上Demo的地址:
  RxBindingDemo

坚持原创技术分享,您的支持是我前进的动力,谢谢!