生活随笔
收集整理的這篇文章主要介紹了
Data-Mediator专题之属性回调
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
目前框架支持的屬性回調(diào)有3種
- 1,默認(rèn)的屬性回調(diào) 含義: 其實(shí)就是某個(gè)屬性變化了, 通知你的意思
- 2, List屬性回調(diào) 含義: 就是監(jiān)聽(tīng)List屬性的 增刪改。
- 3, SparseArray屬性回調(diào)。 含義: 就是監(jiān)聽(tīng)SparseArray屬性的 增刪改。
詳解
-
屬性回調(diào)
-
實(shí)際場(chǎng)景:
- 在工作中,有的時(shí)候我們想監(jiān)聽(tīng)某些數(shù)據(jù)/ui 的變化。以完成統(tǒng)計(jì)功能, 以前在項(xiàng)目中遇到過(guò)。
比如新聞?lì)惖膗i, 頂部有很多tab, 下面是數(shù)據(jù)流列表。 這時(shí)候有這樣一個(gè)需求:
要求用戶(hù)點(diǎn)擊了哪個(gè)item,屬于哪個(gè)tab. 什么類(lèi)型, 在列表中的索引, 這個(gè)時(shí)候我發(fā)現(xiàn),搞統(tǒng)計(jì)還是挺麻煩的。
即使最后我設(shè)計(jì)了一套通用的框架, 還是感覺(jué)不完美。 - 所以后面我想到了數(shù)據(jù)中介者data-mediator這個(gè)框架. 后面會(huì)支持這些更加復(fù)雜的功能。
-
屬性回調(diào),不一定非要綁定到view的屬性上(比如setText, setTextColor, setBackground等等)。 它也可以是事件點(diǎn)擊的屬性, 后面也會(huì)支持。
換句話說(shuō), 以后它可以做很多后臺(tái)的一些操作。
-
回歸正題, 如何使用屬性回調(diào)?
在demo中有這樣一個(gè)簡(jiǎn)單的例子。
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);mMediator.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());}}
復(fù)制代碼僅僅,屬性改變的時(shí)候改變一下文本。很簡(jiǎn)單吧。
-
List屬性編輯器
- 當(dāng)一個(gè)屬性是List類(lèi)型時(shí),會(huì)自動(dòng) 生成beginXXXEditor的方法返回該編輯器, 它可以方便的操作list數(shù)據(jù)。 數(shù)據(jù)模型和代理均有。其中XXX是屬性的名稱(chēng)
- 一般用于綁定列表控件,比如android RecyclerView. 下面是一個(gè)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) {initAdapter();mBinder = DataMediatorFactory.createBinder(RecyclerListBindModule.class);onBindListItems(mBinder);}
@OnClick(R.id.bt_add)
public void onClickAddItem(View v){mBinder.getDataProxy().beginStudentsEditor().add(
0, createItem());}
@OnClick(R.id.bt_add_all)
public void onClickAddItems(View v){List<StudentModule> list = createItems();mBinder.getDataProxy().beginStudentsEditor().addAll(list);}
@OnClick(R.id.bt_remove)
public void onClickRemoveItem(View v){mBinder.getDataProxy().beginStudentsEditor().remove(
0);}
@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<>();
final 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) {