RxJava:自己動手擼一個RxBinding(二)。

Lesincs發表於2018-05-04

RxJava:自己動手擼一個RxBinding(二)。

接上篇,上邊已經實現了將View點選事件RxJava形式實現,這篇實現將TextView以及子類的的文字變化RxJava實現,有了上篇的基礎這篇就很更簡單了. 首先是建立靜態方法,傳入View,注意這裡需要監聽的是文字變化,所以傳入的應該是TextView以及子類.

public class RxView {

    /**
     *
     * @param textView 需要監聽文字變化的view
     * @return 返回一個可被訂閱的observable
     */
    public static Observable<CharSequence> textChanges(TextView textView){
        return null;
    }
}
複製程式碼

然後就是編寫我們的observable,點選事件是在onClickListener上面做文章,文字變化你估計已經猜到了,是在TextWacher上面做文章.

public class ViewTextChangesObservable extends Observable<CharSequence> {

    private TextView mTextView;

    public ViewTextChangesObservable(TextView mTextView) {
        this.mTextView = mTextView;
    }

    @Override
    protected void subscribeActual(final Observer<? super CharSequence> observer) {

        //被訂閱時,為TextView增加TextWatcher,文字文化時,向下遊發射事件
        mTextView.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                observer.onNext(s);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        //傳送現有的事件到下游,便於combineLatest等操作符的使用
        observer.onNext(mTextView.getText());

    }
}
複製程式碼

也很簡單,和點選事件不同的是多傳送了一個目前的文字事件到下游,這樣做是為了方便某些操作符比如(combineLates)的使用,這些操作符依賴observable上一次發射的事件.

修改RxView的程式碼:

public class RxView {

    /**
     *
     * @param textView 需要監聽文字變化的view
     * @return 返回一個可被訂閱的observable
     */
    public static Observable<CharSequence> textChanges(TextView textView){
        return new ViewTextChangesObservable(textView);
    }

複製程式碼

測試程式碼:

public class MainActivity extends AppCompatActivity {

    String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RxView.clicks(findViewById(R.id.tv_obs))
                .subscribe(new Consumer<Object>() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.d(TAG, "我被點選了");
                    }
                });

        TextView textView = findViewById(R.id.tv_obs);

        RxView.textChanges(textView)
                .subscribe(new Consumer<CharSequence>() {
                    @Override
                    public void accept(CharSequence charSequence) throws Exception {
                        Log.d(TAG, "我的當前文字為: " + charSequence);
                    }
                });

        textView.setText("test");
    }
}

複製程式碼

輸出:

05-04 01:58:37.355 3062-3062/april.lesincs.rxbinding_demo D/MainActivity: 我的當前文字為: Hello World!
05-04 01:58:37.355 3062-3062/april.lesincs.rxbinding_demo D/MainActivity: 我的當前文字為: test
複製程式碼

測試成功!監聽文字變化也實現了,程式碼很短,而且只要理解了RxJava,程式碼也很好理解.

GitHub地址

github.com/Lesincs/RxB…

相關文章