1. 程式人生 > >RxJava 和 RxAndroid 四(RxBinding的使用)

RxJava 和 RxAndroid 四(RxBinding的使用)

對Rxjava不熟悉的同學可以先看我之前寫的幾篇文章

前言:RxBinding 是 Jake Wharton 的一個開源庫,它提供了一套在 Android 平臺上的基於 RxJava的 Binding API。所謂 Binding,就是類似設定 OnClickListener 、設定 TextWatcher 這樣的註冊繫結物件的 API。

一:git地址

二、androidStudio 使用

一般的包下面就用

compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'

v4'support-v4' library bindings:

compile 'com.jakewharton.rxbinding:rxbinding-support-v4:0.4.0'

'appcompat-v7' library bindings:

compile 'com.jakewharton.rxbinding:rxbinding-appcompat-v7:0.4.0'

'design' library bindings:

compile 'com.jakewharton.rxbinding:rxbinding-design:0.4.0'

三、程式碼示例

  • Button 防抖處理

     button = (Button) findViewById( R.id.bt ) ;
    
         RxView.clicks( button )
                 .throttleFirst( 2 , TimeUnit.SECONDS )   //兩秒鐘之內只取一個點選事件,防抖操作
                 .subscribe(new Action1<Void>() {
                     @Override
                     public void call(Void aVoid) {
                         Toast.makeText(MainActivity.this, "點選了", Toast.LENGTH_SHORT).show();
                     }
                 }) ;
    
  • 按鈕的長按時間監聽

     button = (Button) findViewById( R.id.bt ) ;
    
     //監聽長按時間
     RxView.longClicks( button)
          .subscribe(new Action1<Void>() {
              @Override
             public void call(Void aVoid) {
             Toast.makeText(MainActivity.this, "long click  !!", Toast.LENGTH_SHORT).show();
             }
         }) ;
    
  • listView 的點選事件、長按事件處理

    listView = (ListView) findViewById( R.id.listview );
    
     List<String> list = new ArrayList<>() ;
         for ( int i = 0 ; i < 40 ; i++ ){
             list.add( "sss" + i ) ;
         }
    
     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1 );
         adapter.addAll( list );
    
     listView.setAdapter( adapter );
    
     //item click event
     RxAdapterView.itemClicks( listView )
         .subscribe(new Action1<Integer>() {
             @Override
             public void call(Integer integer) {
             Toast.makeText(ListActivity.this, "item click " + integer , Toast.LENGTH_SHORT).show();
                 }
             }) ;
    
     //item long click
     RxAdapterView.itemLongClicks( listView)
         .subscribe(new Action1<Integer>() {
             @Override
             public void call(Integer integer) {
                 Toast.makeText(ListActivity.this, "item long click " + integer , Toast.LENGTH_SHORT).show();
                 }
             }) ;
    
- 使用者登入介面,勾選同意隱私協議,登入按鈕就變高亮
button = (Button) findViewById( R.id.login_bt );
checkBox = (CheckBox) findViewById( R.id.checkbox );

RxCompoundButton.checkedChanges( checkBox )
    .subscribe(new Action1<Boolean>() {
        @Override
        public void call(Boolean aBoolean) {
            button.setEnabled( aBoolean );
            button.setBackgroundResource( aBoolean ? R.color.button_yes : R.color.button_no );
            }
        }) ;
```

效果圖

  • 搜尋的時候,關鍵詞聯想功能 。debounce()在一定的時間內沒有操作就會發送事件。

     editText = (EditText) findViewById( R.id.editText );
     listView = (ListView) findViewById( R.id.listview );
    
     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1 );
     listView.setAdapter( adapter );
    
     RxTextView.textChanges( editText )
                 .debounce( 600 , TimeUnit.MILLISECONDS )
                 .map(new Func1<CharSequence, String>() {
                     @Override
                     public String call(CharSequence charSequence) {
                         //get the keyword
                         String key = charSequence.toString() ;
                         return key ;
                     }
                 })
                 .observeOn( Schedulers.io() )
                 .map(new Func1<String, List<String>>() {
                     @Override
                     public List<String> call(String keyWord ) {
                         //get list
                         List<String> dataList = new ArrayList<String>() ;
                         if ( ! TextUtils.isEmpty( keyWord )){
                             for ( String s : getData()  ) {
                                 if (s != null) {
                                     if (s.contains(keyWord)) {
                                         dataList.add(s);
                                     }
                                 }
                             }
                         }
                         return dataList ;
                     }
                 })
                 .observeOn( AndroidSchedulers.mainThread() )
                 .subscribe(new Action1<List<String>>() {
                     @Override
                     public void call(List<String> strings) {
                         adapter.clear();
                         adapter.addAll( strings );
                         adapter.notifyDataSetChanged();
                     }
                 }) ;
    

    執行效果

總結

  • RxBinding就是把 釋出--訂閱 的模式用在了android控制元件的點選,文字變化上。通過 RxBinding 把點選監聽轉換成 Observable 之後,就有了對它進行擴充套件的可能。

  • RxBindingrxlifecycle 結合起來使用,可以控制控制元件監聽的生命週期。關於rxlifecycle的使用,請參照RxJava 和 RxAndroid 三(生命週期控制和記憶體優化)

  • 最後我的個人微信公眾號是:zhaoyanjun125 , 歡迎關注

相關推薦

RxJava RxAndroid RxBinding的使用

對Rxjava不熟悉的同學可以先看我之前寫的幾篇文章 前言:RxBinding 是 Jake Wharton 的一個開源庫,它提供了一套在 Android 平臺上的基於 RxJava的 Binding API。所謂 Binding,就是類似設定 OnClickListener 、設定

RxJava RxAndroid生命週期控制記憶體優化

rxjava rxandroid 趙彥軍 RxJava使我們很方便的使用鏈式程式設計,程式碼看起來既簡潔又優雅。但是RxJava使用起來也是有副作用的,使用越來越多的訂閱,記憶體開銷也會變得很大

RxJava RxAndroid操作符的使用

前言:對Rx不瞭解的朋友可以先看我的第一篇博文 ,是對Rxjava的基本介紹 1、merge操作符,合併觀察物件 19 List<String> list1 = new ArrayList<>() ; 20 List<String&g

RxJava RxAndroid執行緒排程

對rxJava不瞭解的同學可以先看 本文將有幾個例子說明,rxjava執行緒排程的正確使用姿勢。 例1 Observable .create(new Observable.OnSubscribe<String>() {

C語言中存儲類別又分為類:自動auto、靜態static、寄存器的register外部的extern

字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適

C# 《》表達式運算符1

center key 操作 mes string src ring mage ons 1、表達式 1、將變量和字面值(在使用運算符時,它們都稱作操作數)與運算符組合起來就得到了表達式,它是計算的基本構件。 2、簡單的操作包括所有的基本數學操作,如加減乘除;還有專門用於處理布

C# 《》表達式運算符2

技術分享 -a 按位運算 表達式 其他 img 數學 tro .cn 1、位運算符 1、位(bit):在計算中存儲所有數據都采用二進制,那麽二進制的位,便是我們所說的 bit。 1)1Byte = 8bit 1字節 = 8位 2)1k =10

rxJavarxAndroid原始碼解析系列之subscribeOnobserveOn的理解(學習終結篇)

本篇文章主要解決subscribeOn和observeOn這兩個方法為什麼subscribeOn只有一次有效果,observeOn切換多次回撥的都有效果。 不知道朋友有沒有看過rxandroid的原始碼,如果看過的話,就會迎刃而解,沒什麼疑慮啦。沒看過原始碼的朋友,可以看看我這個系列的前幾篇文章

C#基礎知識-函數的定義調用

返回 {0} string 訪問修飾符 容器 列表 rdquo 所有 func 函數也可以稱為方法,可以很方便的把一些行為封裝到函數裏面,當調用這一函數時會把函數塊裏面的代碼按照順序執行,方法可以有多種形式,有無參數,有無返回值等。 1. 函數的定義 函數定

ThreadPoolExecutor的應用實現分析—— 任務處理相關源碼分析

stateless 自身 tran als row exce 繼承 break attribute 轉自:http://www.tuicool.com/articles/rmqYjq 前面一篇文章從Executors中的工廠方法入手,已經對ThreadPoolExecuto

命令符號總結

命令2017-05-13隨記—————————————————————————————— 20.uname 顯示系統內核信息 -r 顯示內核版本 -m 32位,64位本文出自 “一個Linux小白-學習運維” 博客,謝絕轉載!命令和符號總結(二)

黑盒測試用例設計-功能圖法場景法

重新 感覺 結果 軟件 簡單 可能 遷移 面向 通話 7.功能圖法 一個程序的功能包括靜態和動態說明。動態說明描述輸入數據的次序或轉移的次序,和業務流程緊密對應。靜態說明描述了輸入輸出條件之間的對應關系。對於面向市場的產品,其邏輯復雜、組合龐大,必須用動態說明

JS函數對象

inf ack bsp 用法 .cn 求和 封裝 obj [0 在本文章中,將對JS中的函數和對象進行一些講解,不對之處還請之處 一.JS中的函數 1.1無參函數 其形式如下代碼所示 function box(){ alert("我是一個函數,只有被調用才會執行

抽象類abstract class接口interface有什麽異同?

否則 繼承 默認 strong 什麽 成員 -s 實例 abstract 相同點: 1.抽象類和接口都不能被實例化,但可以定義抽象類和接口類型的引用。 2.一個類如果繼承了抽象類和接口,必須要對其中的抽象方法全部實現。(接口中方法默認的是public abstract修飾的

HTML提交方式postget區別實驗

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

html中相對(relative),絕對(absolute)位置以及float的學習使用案例

邊距 col top 20px pre 其他 fff 例如 pan 這幾天著手於CSS的研究,研究的原因主要是工作需要,最近發現如果做前端僅僅會javascript很難盡善盡美,當然懂樣式和html在一定程度上可以讓我們更近一步。 css較為簡單,由於個人擅長編寫代碼,所以

《UNIX環境高級編程》讀書筆記之系統數據文件信息1

返回 -m 獲取 高級編程 記得 clas oid data- size 1.UNIX系統口令文件包括了下圖所看到的的各字段,這些字段包括在<pwd.h>中定義的passwd結構體中 POSIX定義了兩個獲取口令文件項的函數。在給出用戶登錄名或用戶ID後

9.9遞歸動態規劃——N皇後

其它 ace req case create lac any urn distance /** * 功能:打印八皇後在8*8棋盤上的各種擺法。當中每一個皇後都不同行、不同列,也不在對角線上。 * 這裏的“對角線”指的是全部的對角線,不僅僅是平分整個棋盤的那兩

數據庫的三大範式五大約束

date 查看 引擎 uniq 文件 緩沖 運行 數值 alt 一、三大範式:   1. 第一範式(1NF):數據表中的每一列(每個字段)必須是不可拆分的最小單元,也就是確保每一列的原子性;   2. 第二範式(2NF):滿足1NF後,要求表中的所有列,都必須依賴於主鍵,而

第6章 靜態路由動態路由1_靜態路由

align 將在 跟蹤 添加 測試 字母 ppp協議 必須 缺少 1. 路由——網絡層實現的功能 1.1 路由功能 (1)網絡層的功能:給傳輸層協議提供簡單靈活的、無連接的、盡最大努力交付的數據包服務。 (2)路由器為每一個數據包單獨地選擇轉發路徑,網絡層並不提供服務質量的