日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Data-Mediator专题之属性回调

發布時間:2024/4/13 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Data-Mediator专题之属性回调 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目前框架支持的屬性回調有3種

  • 1,默認的屬性回調 含義: 其實就是某個屬性變化了, 通知你的意思
  • 2, List屬性回調 含義: 就是監聽List屬性的 增刪改。
  • 3, SparseArray屬性回調。 含義: 就是監聽SparseArray屬性的 增刪改。

詳解

  • 屬性回調

  • 實際場景:

    • 在工作中,有的時候我們想監聽某些數據/ui 的變化。以完成統計功能, 以前在項目中遇到過。
      比如新聞類的ui, 頂部有很多tab, 下面是數據流列表。 這時候有這樣一個需求:
      要求用戶點擊了哪個item,屬于哪個tab. 什么類型, 在列表中的索引, 這個時候我發現,搞統計還是挺麻煩的。
      即使最后我設計了一套通用的框架, 還是感覺不完美。
    • 所以后面我想到了數據中介者data-mediator這個框架. 后面會支持這些更加復雜的功能。
  • 屬性回調,不一定非要綁定到view的屬性上(比如setText, setTextColor, setBackground等等)。 它也可以是事件點擊的屬性, 后面也會支持。
    換句話說, 以后它可以做很多后臺的一些操作。

  • 回歸正題, 如何使用屬性回調?
    在demo中有這樣一個簡單的例子。

public class TestPropertyChangeActivity extends BaseActivity {@BindView(R.id.tv_desc)TextView mTv_desc;@BindView(R.id.bt_set_text_on_TextView)Button mBt_changeProperty;@BindView(R.id.bt_set_text_on_mediator)Button mBt_temp;DataMediator<StudentModule> mMediator;@Overrideprotected int getLayoutId() {return R.layout.ac_test_double_bind;}@Overrideprotected void onInit(Context context, Bundle savedInstanceState) {mBt_changeProperty.setText("click this to change property");mBt_temp.setVisibility(View.GONE);//為數據模型創建 中介者。mMediator = DataMediatorFactory.createDataMediator(StudentModule.class);//添加屬性callbackmMediator.addDataMediatorCallback(new DataMediatorCallback<StudentModule>() {@Overridepublic void onPropertyValueChanged(StudentModule data, Property prop, Object oldValue, Object newValue) {Logger.w("TestPropertyChangeActivity","onPropertyValueChanged","prop = "+ prop.getName() + " ,oldValue = " + oldValue + " ,newValue = " + newValue);//改變文本 mTv_desc.setText(String.valueOf(newValue));}});mMediator.getDataProxy().setName("heaven7");}@OnClick(R.id.bt_set_text_on_TextView)public void onClickSetTextOnTextView(View v){mMediator.getDataProxy().setName("time: " + System.currentTimeMillis());}}復制代碼

僅僅,屬性改變的時候改變一下文本。很簡單吧。

  • List屬性編輯器

  • 當一個屬性是List類型時,會自動 生成beginXXXEditor的方法返回該編輯器, 它可以方便的操作list數據。 數據模型和代理均有。其中XXX是屬性的名稱
  • 一般用于綁定列表控件,比如android RecyclerView. 下面是一個demo:
public class TestRecyclerListBindActivity extends BaseActivity {private static final Random sRan = new Random();@BindView(R.id.rv)RecyclerView mRv;private Binder<RecyclerListBindModule> mBinder;private TestRecyclerListAdapter<StudentModule> mAdapter;@Overrideprotected int getLayoutId() {return R.layout.ac_test_recycler_list_bind;}@Overrideprotected void onInit(Context context, Bundle savedInstanceState) {//初始化adapterinitAdapter();//創建bindermBinder = DataMediatorFactory.createBinder(RecyclerListBindModule.class);//綁定列表onBindListItems(mBinder);}//添加一個item@OnClick(R.id.bt_add)public void onClickAddItem(View v){mBinder.getDataProxy().beginStudentsEditor().add(0, createItem());}//添加一組items@OnClick(R.id.bt_add_all)public void onClickAddItems(View v){List<StudentModule> list = createItems();mBinder.getDataProxy().beginStudentsEditor().addAll(list);}//刪除一個 item@OnClick(R.id.bt_remove)public void onClickRemoveItem(View v){mBinder.getDataProxy().beginStudentsEditor().remove(0);}//替換所有items@OnClick(R.id.bt_replace)public void onClickReplaceItem(View v){mBinder.getDataProxy().setStudents(createItems());}protected void onBindListItems(Binder<RecyclerListBindModule> mBinder) {//通用的綁定方法. 這里用于綁定列表mBinder.bindList(RecyclerListBindModule.PROP_students,mAdapter);}protected void initAdapter() {mRv.setLayoutManager(new LinearLayoutManager(this));mRv.setAdapter(mAdapter = new TestRecyclerListAdapter<StudentModule>(R.layout.item_test_recycler_list, null) {@Overrideprotected void onBindData(Context context, int position,StudentModule item, int itemLayoutId, ViewHelper helper) {helper.setText(R.id.tv_name, item.getName()).setText(R.id.tv_age, ""+item.getAge());}});}private static StudentModule createItem(){StudentModule data = DataMediatorFactory.createData(StudentModule.class);data.setAge(sRan.nextInt(10001));data.setName("google__" + sRan.nextInt(100));return data;}@NonNullprivate static List<StudentModule> createItems() {List<StudentModule> list = new ArrayList<>();//just mock datafinal int count = sRan.nextInt(10) + 1;for (int i =0 ; i< count ; i++){list.add(createItem());}return list;}private static abstract class TestRecyclerListAdapter<T extends ISelectable>extends QuickRecycleViewAdapter<T> implementsBaseListPropertyCallback.IItemManager<T> {public TestRecyclerListAdapter(int layoutId, List<T> mDatas) {super(layoutId, mDatas);}@Overridepublic void addItems(List<T> items) {//增加getAdapterManager().addItems(items);}@Overridepublic void addItems(int index, List<T> items) {//增加getAdapterManager().addItems(index, items);}@Overridepublic void removeItems(List<T> items) {//刪除getAdapterManager().removeItems(items);}@Overridepublic void replaceItems(List<T> items) {//替換所有getAdapterManager().replaceAllItems(items);}@Overridepublic void onItemChanged(int index, T oldItem, T newItem) {//改變元素getAdapterManager().setItem(index, newItem);}}} 復制代碼

復雜么? 不復雜,第一步綁定了列表。然后改變數據的時候回調到了BaseListPropertyCallback.IItemManager

SparseArray屬性編輯器

  • 當屬性類型是SparseArray時,會自動生成SparseArray屬性編輯器: beginXXXEdiator, XXX是屬性名稱.
  • 下面是一個示例程序:
public class TestSparseArrayActivity extends BaseActivity {private static final String TAG = "TestSparseArray";@BindView(R.id.tv_sa)TextView mTv_sa;private DataMediator<TestBindModule> mDm;private Set<Integer> mIndexes = new HashSet<>();@Overrideprotected int getLayoutId() {return R.layout.ac_test_sparse_array;}@Overrideprotected void onInit(Context context, Bundle savedInstanceState) {mDm = DataMediatorFactory.createDataMediator(TestBindModule.class);// 這里直接用屬性回調。也可以用binder.bind(String property, SparseArrayPropertyCallback<? super T> callback)方法mDm.addDataMediatorCallback(DataMediatorCallback.createForSparse(TestBindModule.PROP_cityData2.getName(), new CallbackImpl()));}// put 操作@OnClick(R.id.bt_put)public void onClickPut(View v){final StudentModule stu = createStu(-1);mDm.getDataProxy().beginCityData2Editor().put((int)stu.getId(), stu).end();}// 移除操作(通過key)@OnClick(R.id.bt_remove_key)public void onClickRemoveByKey(View v){if(!mIndexes.isEmpty()){final Integer index = mIndexes.iterator().next();mDm.getDataProxy().beginCityData2Editor().remove(index);mIndexes.remove(index);}else{mTv_sa.setText("");Logger.w(TAG , "onClickRemoveByKey", "already empty");}}// 移除操作(通過value)@OnClick(R.id.bt_remove_value)public void onClickRemoveByValue(View v){if(!mIndexes.isEmpty()){final Integer index = mIndexes.iterator().next();mDm.getDataProxy().beginCityData2Editor().removeByValue(createStu(index));mIndexes.remove(index);}else{mTv_sa.setText("");Logger.w(TAG , "onClickRemoveByValue", "already empty");}}//清空操作@OnClick(R.id.bt_clear)public void onClickClear(View v){if(!mIndexes.isEmpty()){mDm.getDataProxy().beginCityData2Editor().clear();mIndexes.clear();}else{mTv_sa.setText("");Logger.w(TAG , "onClickClear", "already empty");}}private StudentModule createStu(int index) {if(index < 0){index = new Random().nextInt(5);}mIndexes.add(index);return DataMediatorFactory.createData(StudentModule.class).setId(index).setName("google_" + index).setAge(index);}private void setLogText(String method, String msg){mTv_sa.setText(method + ": \n " + msg + "\n\n now is: \n"+ mDm.getData().getCityData2().toString());}private class CallbackImpl implements SparseArrayPropertyCallback<TestBindModule>{@Overridepublic void onEntryValueChanged(TestBindModule data, Property prop, Integer key,Object oldValue, Object newValue) {final String msg = "oldValue = " + oldValue + " ,newValue = " + newValue;Logger.i(TAG , "onEntryValueChanged", msg);setLogText("onEntryValueChanged", msg);}@Override //添加key-valuepublic void onAddEntry(TestBindModule data, Property prop, Integer key, Object value) {final String msg = "key = " + key + " ,value = " + value;Logger.i(TAG , "onAddEntry", msg);setLogText("onAddEntry", msg);}@Override //移除key-valuepublic void onRemoveEntry(TestBindModule data, Property prop, Integer key, Object value) {final String msg = "key = " + key + " ,value = " + value;Logger.i(TAG , "onRemoveEntry", msg);setLogText("onRemoveEntry", msg);}@Override //清空public void onClearEntries(TestBindModule data, Property prop, Object entries) {final String msg = entries.toString(); //here entries is SparseArrayLogger.i(TAG , "onClearEntries", msg);setLogText("onClearEntries", msg);}@Override //一般的屬性改變public void onPropertyValueChanged(TestBindModule data, Property prop,Object oldValue, Object newValue) {final String msg = "oldValue = " + oldValue + " ,newValue = " + newValue;Logger.i(TAG , "onPropertyValueChanged", msg);setLogText("onPropertyValueChanged", msg);}@Overridepublic void onPropertyApplied(TestBindModule data, Property prop, Object value) {final String msg = "value = " + value;Logger.i(TAG , "onPropertyApplied", msg);setLogText("onPropertyApplied", msg);}} }復制代碼

想要體驗最新的特性 ?

請到github/data-mediator體驗。 如果覺得不錯,請star支持下項目哈。

歡迎大家star, fork,contribute ,提issue. 它會越來越棒。

Thanks for reading !

技術源于分享!

總結

以上是生活随笔為你收集整理的Data-Mediator专题之属性回调的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲国产精品久久精品怡红院 | 天天免费看av| 精品毛片一区二区三区 | 看黄网站在线观看 | 久久国产精品免费看 | 日本一区二区在线视频 | 草莓视频18免费观看 | 成人影视免费 | 在线观看av的网站 | 久久久久久99 | 日本一区不卡 | 久草影音 | 天天看片天天爽 | 欧美黄色性 | 欧美日韩一区二区综合 | 色综合一区二区 | 亚洲国产精品久久久久久久 | 成人欧美一级特黄 | 成人国产在线观看 | 91视频在线看 | 可以看的黄色网 | 日鲁鲁 | 蜜臀久久99精品久久久无需会员 | 久久婷婷国产麻豆91天堂 | 五月天久久久久久 | 免费成人深夜夜行网站视频 | 97精品一区二区三区 | 色久影院 | 蜜桃成人在线视频 | 国产精品久久久久久久久久辛辛 | 国产欧美精品久久 | 亚洲视频在线一区二区 | 午夜精品在线 | 久久久久亚洲av片无码v | 丰满熟妇肥白一区二区在线 | 九九黄色| 黄色91免费观看 | 婷婷影音| 亚洲欧美综合自拍 | 国产91一区二区三区在线精品 | 国产日本精品 | 波多野吉衣毛片 | 国产91热爆ts人妖系列 | 日日夜夜2017 | 香蕉黄色网 | 久久久久午夜 | 国产一区二区激情视频 | 精品久久久久久久久久岛国gif | 亚洲自拍中文字幕 | 中文字幕一区二区在线观看视频 | 久久男人 | 久久久国产一区 | 毛片大全在线观看 | 五月婷婷激情四射 | jizz在线观看视频 | 欧美一区二区三区免费 | 搡国产老太xxx网站 高h喷汁呻吟3p | 男女做爰猛烈高潮描写 | av在线电影网站 | 日本人极品人妖高潮 | 日韩一区二区精品视频 | 美女自拍视频 | 岛国大片在线免费观看 | 久久精品视屏 | 日韩精品一二三四区 | 日韩欧美一区二区区 | 欧美日韩一区二区中文字幕 | 久久天天操 | 国产日本精品 | h网站在线观看 | 中文字幕电影一区二区 | 中国女人一级片 | 国产精品国产精品国产专区不卡 | 秋霞影院午夜伦 | 天天综合网在线 | 成人在线网站 | 久久久精品免费视频 | 精品国产乱码久久久久久久软件 | 毛片视频在线免费观看 | 爆乳2把你榨干哦ova在线观看 | 影音先锋亚洲成aⅴ人在 | 涩视频在线观看 | 欧美在线免费 | 日韩草比| 欧美大片在线免费观看 | 日本精品一区二区三区视频 | 97久久人澡人人添人人爽 | 亚洲男人天堂2020 | 欧美日韩综合视频 | 国产1区| 福利在线视频观看 | 午夜成人在线视频 | 欧美亚洲图片小说 | 免费看日产一区二区三区 | 欧美乱码精品 | 天堂在线一区二区 | 18岁禁黄网站 | 午夜免费福利在线 | 亚洲射射射|