精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS關(guān)于元數(shù)據(jù)綁定框架探索

開發(fā) OpenHarmony
根據(jù)官方Demo介紹,元數(shù)據(jù)綁定框架是基于HarmonyOS SDK開發(fā)的一套提供UI和數(shù)據(jù)源綁定能力的框架。通過使用元數(shù)據(jù)綁定框架,HarmonyOS應用開發(fā)者無需開發(fā)繁瑣重復的代碼即可實現(xiàn)綁定UI和數(shù)據(jù)源。

[[418493]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

在上一篇HarmonyOS DataBinding 使用指南中,有人提到了元數(shù)據(jù)綁定框架并提出了疑問,元數(shù)據(jù)綁定框架跟DataBinding有什么區(qū)別?功能上似乎也是做數(shù)據(jù)綁定,我查閱了官方文檔,沒有太多的資料,只有Codelabs上有個Demo教程,帶著這種疑問,讓我們一起來探索一下。

概述

根據(jù)官方Demo介紹,元數(shù)據(jù)綁定框架是基于HarmonyOS SDK開發(fā)的一套提供UI和數(shù)據(jù)源綁定能力的框架。通過使用元數(shù)據(jù)綁定框架,HarmonyOS應用開發(fā)者無需開發(fā)繁瑣重復的代碼即可實現(xiàn)綁定UI和數(shù)據(jù)源。這跟Databinding功能類似,接下來讓我們再來看看它們有什么不同之處。

開始使用

簡單UI組件綁定

1.首先,我們在模塊的build.gradle文件中的dependencies中添加對元數(shù)據(jù)綁定框架的引用,并開啟注解處理器:

  1. implementation 'com.huawei.middleplatform:ohos-metadata-annotation:1.0.0.0' 
  2. implementation 'com.huawei.middleplatform:ohos-metadata-binding:1.0.0.0' 
  3. annotationProcessor 'com.huawei.middleplatform:ohos-metadata-processor:1.0.0.0' 
  1. ohos { 
  2.     compileOptions { 
  3.         annotationEnabled true 
  4.     } 

2.引用之后我們在MyApplication中對其進行初始化并添加對應注解,具體代碼如下:

  1. /** 
  2.  * requireData = true 表示該application需要獲取數(shù)據(jù) 
  3.  * exportData = false 表示該application不對外提供數(shù)據(jù) 
  4.  */ 
  5. @MetaDataApplication(requireData = true, exportData = false
  6. public class MyApplication extends AbilityPackage { 
  7.     private static Context context; 
  8.  
  9.     @Override 
  10.     public void onInitialize() { 
  11.         super.onInitialize(); 
  12.         mContext = this.getContext(); 
  13.         //初始化MetaDataFramework 
  14.         MetaDataFramework.init(this); 
  15.     } 
  16.       public static Context getApplication() { 
  17.         return context; 
  18.     } 

其中注解中的requireData表示該application是否需要獲取數(shù)據(jù),exportData表示該application是否外提供數(shù)據(jù),大家可根據(jù)自己的需求進行配置。

3.接下來我們需要定義元數(shù)據(jù),數(shù)據(jù)是以Json的格式,而DataBinding則是采用ActiveData對象綁定數(shù)據(jù)。我們簡單的定義兩個參數(shù)。Json數(shù)據(jù)采用得是Json Schema定義的一套詞匯和規(guī)則,我們用這套詞匯和規(guī)則用來定義Json元數(shù)據(jù)。最后我們需要將元數(shù)據(jù)Json文件放在resource/rawfile.jsonschema路徑下。

  1.   "id""com.example.meta-data.time"
  2.   "title""test"
  3.   "$schema""http://json-schema.org/draft-04/schema#"
  4.   "description""test description"
  5.   "type""object"
  6.   "properties": { 
  7.     "id": { 
  8.       "type""integer" 
  9.     }, 
  10.     "message": { 
  11.       "type""string" 
  12.     } 
  13.   } 

4.在我們XML布局文件中,最外層的Layout中加入元數(shù)據(jù)綁定的框架的命名空間:xmlns:metaDataBinding,并創(chuàng)建元數(shù)據(jù)實體,作用跟我們Databinding的標簽類似,之后再我們組件中進行數(shù)據(jù)綁定,注意!在Databinding中用的是ohos的命名空間,而使用元數(shù)據(jù)綁定的時候,需要用metaDataBinding命名空間,具體代碼如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     xmlns:metaDataBinding="http://schemas.huawei.com/res/metaDatabinding" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:orientation="vertical"
  8.     <request-meta-data 
  9.         name="TestData" 
  10.         schema="com.example.meta-data.time" 
  11.         uri="dataability:///com.example.time.db.TestDataAbility"/> 
  12.      <Text 
  13.         ohos:id="$+id:title_text" 
  14.         ohos:height="300" 
  15.         ohos:width="match_parent" 
  16.         metaDataBinding:text="@{TestData.message}" 
  17.         ohos:text_alignment="center" 
  18.         ohos:text_color="#FF555555" 
  19.         ohos:text_size="50"/> 
  20. </DirectionalLayout> 

這時候這個標簽就會報錯:request-meta-data is not allowed here,具體原因還不清楚,懷疑是編譯器的原因,但沒關(guān)系,這并不影響我們的運行。

言歸正傳,在標簽中,name為元數(shù)據(jù)名稱,之后我們進行綁定的時候根據(jù)這個名稱來引用,schema需要與剛定義的Json數(shù)據(jù)中id一致,uri則是我們使用元數(shù)據(jù)綁定的DataAbility路徑。

5.接下來需要在代碼中請求綁定,我們在AbilitySlice中的onStart方法中添加如下代碼:

  1. @Override 
  2. public void onStart(Intent intent) { 
  3.     super.onStart(intent); 
  4.       Test alarm = TestOperation.queryFirst(this); 
  5.         if (alarm == null) { 
  6.             TestOperation.insert(this); 
  7.         } 
  8.     MetaDataRequestInfo request = new MetaDataRequestInfo.Builder() 
  9.             .setMetaDataClass("TestData", TestData.class) 
  10.             .setSyncRequest("TestData"true
  11.             .build(); 
  12.     MetaDataBinding binding; 
  13.     Component mainComponent; 
  14.     try { 
  15.         // 請求綁定 
  16.         binding = AbilityindexpageMetaDataBinding.requestBinding(this, request, null); 
  17.         // 獲得綁定的界面組件 
  18.         mainComponent = binding.getLayoutComponent(); 
  19.     } catch (DataSourceConnectionException e) { 
  20.         mainComponent = LayoutScatter.getInstance(this) 
  21.                 .parse(ResourceTable.Layout_error_layout, nullfalse); 
  22.     } 
  23.     setUIContent((ComponentContainer) mainComponent); 

剛才第4點說到,TestData為對應的XML中標簽中的name,TestData類是繼承自DataAbilityMetaData的類,我們可以在里面根據(jù)業(yè)務需求對數(shù)據(jù)進行處理,作用有點類似DataBinding的Model。配置完布局文件之后會自動生成XXXMetaDataBinding文件,然后通過調(diào)用requestBinding方法進行綁定,如果綁定異常的話我們就返回一個錯誤頁面。

  1. public class TestData  extends DataAbilityMetaData { 
  2.     public String toMessage(String message) { 
  3.         return message + "元數(shù)據(jù)綁定"
  4.     } 

6.配置部分基本完成,接下來就是配置數(shù)據(jù)庫部分。數(shù)據(jù)庫部分內(nèi)容也比較多,這里只做簡單的說明。關(guān)于數(shù)據(jù)庫后續(xù)會有專門的文章進行詳細講解,歡迎大家訂閱關(guān)注。

在我們上面XML布局中,標簽uri屬性指向的就是我們的DataAbility,這邊主要做的就是數(shù)據(jù)訪問更新等等。

  1. public class TestDataAbility extends Ability { 
  2.     public static final Uri CLOCK_URI = Uri.parse( 
  3.             "dataability:///com.example.time.db.TestDataAbility"); 
  4.  
  5.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD001100, "Demo"); 
  6.     private OrmContext ormContext = null
  7.  
  8.     @Override 
  9.     public void onStart(Intent intent) { 
  10.         super.onStart(intent); 
  11.         HiLog.info(LABEL_LOG, "TestDataAbility onStart"); 
  12.         DatabaseHelper manager = new DatabaseHelper(this); 
  13.         ormContext = manager.getOrmContext( 
  14.                 TestOrmDatabase.DATABASE_NAME_ALIAS, 
  15.                 TestOrmDatabase.DATABASE_NAME, 
  16.                 TestOrmDatabase.class); 
  17.     } 
  18.  
  19.     @Override 
  20.     public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) { 
  21.         if (uri.equals(CLOCK_URI)) { 
  22.             OrmPredicates ormPredicates = DataAbilityUtils.createOrmPredicates(predicates, Test.class); 
  23.             return ormContext.query(ormPredicates, columns); 
  24.         } 
  25.         return null
  26.     } 
  27.  
  28.     @Override 
  29.     public int insert(Uri uri, ValuesBucket value) { 
  30.         Test alarm = new Test(); 
  31.         if (ormContext.insert(alarm.fromValues(value))) { 
  32.             ormContext.flush(); 
  33.             DataAbilityHelper.creator(this, uri).notifyChange(uri); 
  34.             return (int) alarm.getRowId(); 
  35.         } 
  36.         return -1; 
  37.     } 
  38.  
  39.     @Override 
  40.     public int delete(Uri uri, DataAbilityPredicates predicates) { 
  41.         return 0; 
  42.     } 
  43.  
  44.     @Override 
  45.     public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) { 
  46.         OrmPredicates ormPredicates; 
  47.         if (predicates == null) { 
  48.             Integer id = value.getInteger("id"); 
  49.             if (id == null) { 
  50.                 return -1; 
  51.             } 
  52.             value.delete("id"); 
  53.             ormPredicates = new OrmPredicates(Test.class).equalTo("id", id); 
  54.         } else { 
  55.             ormPredicates = DataAbilityUtils.createOrmPredicates(predicates, Test.class); 
  56.         } 
  57.         int rst = ormContext.update(ormPredicates, value); 
  58.         DataAbilityHelper.creator(getContext(), uri).notifyChange(uri); 
  59.         return rst; 
  60.     } 
  61.  
  62.     @Override 
  63.     public FileDescriptor openFile(Uri uri, String mode) { 
  64.         return null
  65.     } 
  66.  
  67.     @Override 
  68.     public String[] getFileTypes(Uri uri, String mimeTypeFilter) { 
  69.         return new String[0]; 
  70.     } 
  71.  
  72.     @Override 
  73.     public PacMap call(String method, String arg, PacMap extras) { 
  74.         return null
  75.     } 
  76.  
  77.     @Override 
  78.     public String getType(Uri uri) { 
  79.         return null
  80.     } 
  81.  
  82.     @Override 
  83.     protected void onStop() { 
  84.         super.onStop(); 
  85.         if (ormContext != null) { 
  86.             ormContext.close(); 
  87.         } 
  88.     } 

TestOperation類,是一個數(shù)據(jù)庫的操作類,負責數(shù)據(jù)庫的查詢或?qū)懭氲炔僮鳌?/p>

  1. public class TestOperation { 
  2.     private static final String COL_MSG = "message"
  3.     private static int idx = 0; 
  4.     private static int count = 0; 
  5.  
  6.     public TestOperation() { 
  7.     } 
  8.     public static void insert(Context context) { 
  9.         try { 
  10.             int time = Math.abs((int) System.currentTimeMillis()); 
  11.             ValuesBucket bucket = new ValuesBucket(); 
  12.             bucket.putString(COL_MSG, "元數(shù)據(jù)綁定" + idx++); 
  13.             DataAbilityHelper.creator(context).insert(TestDataAbility.CLOCK_URI, bucket); 
  14.         } catch (DataAbilityRemoteException ex) { 
  15.         } 
  16.     } 
  17.     public static void insertAnAlarm(MetaDataBinding binding) { 
  18.         MetaDataRequestInfo.RequestItem requestItem = binding.getRequestInfo().getRequestItem("TestData"); 
  19.         MetaData metaData = AbilityindexpageMetaDataBinding.createMetaData(requestItem); 
  20.         metaData.put(COL_MSG, "count" + count); 
  21.         binding.addMetaData(metaData, requestItem); 
  22.         count++; 
  23.     } 
  24.     public static Test queryFirst(Context context) { 
  25.         DataAbilityHelper helper = DataAbilityHelper.creator(context); 
  26.         ResultSet resultSet = null
  27.         try { 
  28.             resultSet = helper.query( 
  29.                     TestDataAbility.CLOCK_URI, 
  30.                     new String[]{COL_MSG}, 
  31.                     null); 
  32.         } catch (DataAbilityRemoteException e) { 
  33.         } 
  34.         Test test = null
  35.         if (resultSet != null) { 
  36.             boolean hasData = resultSet.goToFirstRow(); 
  37.             if (!hasData) { 
  38.                 return null
  39.             } 
  40.             test = getQueryResults(resultSet); 
  41.         } 
  42.         return test; 
  43.     } 
  44.  
  45.     private static Test getQueryResults(ResultSet resultSet) { 
  46.         Test alarm = new Test(); 
  47.         for (String column : resultSet.getAllColumnNames()) { 
  48.             int index = resultSet.getColumnIndexForName(column); 
  49.             alarm.setMessage(getFromColumn(resultSet, index).toString()); 
  50.         } 
  51.         return alarm; 
  52.     } 
  53.  
  54.     private static Object getFromColumn(ResultSet resultSet, int index) { 
  55.         ResultSet.ColumnType type = resultSet.getColumnTypeForIndex(index); 
  56.         switch (type) { 
  57.             case TYPE_INTEGER: 
  58.                 return resultSet.getInt(index); 
  59.             case TYPE_FLOAT: 
  60.                 return resultSet.getDouble(index); 
  61.             case TYPE_STRING: 
  62.                 return resultSet.getString(index); 
  63.             case TYPE_BLOB: 
  64.             case TYPE_NULL: 
  65.             default
  66.                 return null
  67.         } 
  68.     } 

TestOrmDatabase類,就是我們對象關(guān)系映射數(shù)據(jù)庫的相關(guān)操作,具體可看官方文檔。

  1. @Database(entities = {Test.class}, version = 1) 
  2. public abstract class TestOrmDatabase extends OrmDatabase { 
  3.  
  4.     public static final String DATABASE_NAME = "TestOrmDatabase.db"
  5.  
  6.     public static final String DATABASE_NAME_ALIAS = "TestOrmDatabase"

到目前位置我們整個元數(shù)據(jù)綁定的開發(fā)流程就完整了,下面是展示頁面:

【中軟國際】HarmonyOS 關(guān)于元數(shù)據(jù)綁定框架探索-鴻蒙HarmonyOS技術(shù)社區(qū)

Text顯示的內(nèi)容就是我們TestOperation類,在數(shù)據(jù)庫添加的Message的數(shù)據(jù)( bucket.putString(COL_MSG, “元數(shù)據(jù)綁定” + idx++))。

UI容器組件綁定

接下來給大家說一下容器組件綁定,容器組件也就是我們的ListContainer,無處不列表,可以說是我們平時用的最多的組件,接下來給大家講一下ListContainer如何進行綁定。(大致配置與簡單UI差不多,下面只列出它們的區(qū)別之處)

1.首先我們需要在XML中添加ListContainer組件,我們直接沿用剛才的數(shù)據(jù):

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     xmlns:metaDataBinding="http://schemas.huawei.com/res/metaDatabinding" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:orientation="vertical"
  8.     <request-meta-data 
  9.         name="TestData" 
  10.         schema="com.example.meta-data.time" 
  11.         uri="dataability:///com.example.time.db.TestDataAbility"/> 
  12.     <Text 
  13.         ohos:id="$+id:title_text" 
  14.         ohos:height="300" 
  15.         ohos:width="match_parent" 
  16.         ohos:text="容器組件綁定" 
  17.         ohos:text_alignment="center" 
  18.         ohos:text_color="#FF555555" 
  19.         ohos:text_size="50"/> 
  20.  
  21.     <ListContainer 
  22.         ohos:id="$+id:list_view" 
  23.         ohos:top_margin="10vp" 
  24.         ohos:height="match_parent" 
  25.         ohos:width="match_parent" 
  26.         /> 
  27. </DirectionalLayout> 

2.跟正常使用一樣,我們需要創(chuàng)建繼承BaseItemProvider的Provider類:

  1. public class TestListProvider extends BaseItemProvider { 
  2.  
  3.     private final Context mContext; 
  4.     private List<TestRow> mData; 
  5.  
  6.     public TestListProvider(Context mContext) { 
  7.         this.mContext = mContext; 
  8.     } 
  9.  
  10.     public void initData(List<TestRow> testList) { 
  11.         this.mData = testList; 
  12.     } 
  13.     public void addItems(List<TestRow> alarmList) { 
  14.         this.mData.addAll(alarmList); 
  15.         mContext.getUITaskDispatcher().asyncDispatch(this::notifyDataChanged); 
  16.     } 
  17.     @Override 
  18.     public int getCount() { 
  19.         return mData.size(); 
  20.     } 
  21.  
  22.     @Override 
  23.     public Object getItem(int i) { 
  24.         return mData.get(i); 
  25.     } 
  26.  
  27.     @Override 
  28.     public long getItemId(int i) { 
  29.         return i; 
  30.     } 
  31.  
  32.     @Override 
  33.     public Component getComponent(int i, Component component, ComponentContainer componentContainer) { 
  34.         TestRow testRow = mData.get(i); 
  35.         if (component == null) { 
  36.             Component newComponent = testRow.createComponent(); 
  37.             testRow.bindComponent(newComponent); 
  38.             return newComponent; 
  39.         } else { 
  40.             testRow.bindComponent(component); 
  41.             return component; 
  42.         } 
  43.     } 

3.TestRow表示列表的條目,它持有一個元數(shù)據(jù)對象,我們對每個item進行數(shù)據(jù)綁定,獲取UI組件及響應點擊事件。

  1. public class TestRow { 
  2.     private final AbilitySlice context; 
  3.     private final TestData clockMeta; 
  4.  
  5.     public TestRow(AbilitySlice context, MetaData clockMeta) { 
  6.         this.context = context; 
  7.         this.clockMeta = (TestData) clockMeta; 
  8.     } 
  9.  
  10.     public Component createComponent() { 
  11.        TestlistitemlayoutMetaDataBinding metaBinding = TestlistitemlayoutMetaDataBinding.createBinding(context, clockMeta); 
  12.         Component comp = metaBinding.getLayoutComponent(); 
  13.         comp.setTag(metaBinding); 
  14.         return comp; 
  15.     } 
  16.  
  17.     public void bindComponent(Component component) { 
  18.         TestlistitemlayoutMetaDataBinding metaBinding = (TestlistitemlayoutMetaDataBinding) component.getTag(); 
  19.         metaBinding.reBinding(component, clockMeta); 
  20.     } 
  21. //      public void onClick() {  
  22. //       context.present(new XXXSlice(clockMeta), new Intent());  
  23. //   }  

TestlistitemlayoutMetaDataBinding是我們定義布局后自動生成的MetaDataBinding類,通過createBinding方法將布局與數(shù)據(jù)進行綁定。

4.接下來看一下item的布局:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     xmlns:metaDataBinding="http://schemas.huawei.com/res/metaDatabinding" 
  5.     ohos:height="match_content" 
  6.     ohos:width="match_parent" 
  7.     ohos:background_element="#000000" 
  8.     ohos:orientation="vertical"
  9.     <using-meta-data 
  10.         class="com.example.time.bean.TestData" 
  11.         name="TestData" 
  12.         schema="com.example.meta-data.time"/> 
  13.     <DirectionalLayout 
  14.         ohos:height="match_content" 
  15.         ohos:width="match_parent" 
  16.         ohos:background_element="#3c3c3c" 
  17.         ohos:bottom_padding="15vp" 
  18.         ohos:end_padding="15vp" 
  19.         ohos:orientation="vertical" 
  20.         ohos:start_padding="15vp" 
  21.         ohos:top_padding="15vp"
  22.  
  23.         <Text 
  24.             ohos:id="$+id:title_tv" 
  25.             ohos:height="match_content" 
  26.             ohos:width="match_parent" 
  27.             metaDataBinding:text="@={TestData.message}" 
  28.             ohos:text_size="16fp" 
  29.             ohos:text_color="#ffffff" 
  30.             /> 
  31.         <Text 
  32.             ohos:id="$+id:desc_tv" 
  33.             ohos:height="match_content" 
  34.             ohos:width="match_parent" 
  35.             ohos:top_margin="10vp" 
  36.             metaDataBinding:text="@={TestData.message}" 
  37.             ohos:text_size="12fp" 
  38.             ohos:text_color="#727272" 
  39.             /> 
  40.     </DirectionalLayout> 
  41.  
  42. </DirectionalLayout> 

這里需要注意的是,和普通布局區(qū)別在于item的元數(shù)據(jù)實體為

5.接下來就是在AbilitySlice中進行請求綁定:

  1. public class IndexPageAbilitySlice extends AbilitySlice implements IMetaDataObserver { 
  2.     private ListContainer mListContainer; 
  3.     private TestListProvider mTestListProvider; 
  4.  
  5.     @Override 
  6.     public void onStart(Intent intent) { 
  7.         super.onStart(intent); 
  8.         initView(); 
  9.     } 
  10.  
  11.     private void initView() { 
  12.         Test alarm = TestOperation.queryFirst(this); 
  13.         if (alarm == null) { 
  14.             TestOperation.insert(this); 
  15.         } 
  16.         // 創(chuàng)建元數(shù)據(jù)請求對象 
  17.         MetaDataRequestInfo request = new MetaDataRequestInfo.Builder() 
  18.                 .setMetaDataClass("TestData", TestData.class) 
  19.                 .setSyncRequest("TestData"false
  20.                 .build(); 
  21.         MetaDataBinding binding; 
  22.         Component mainComponent; 
  23.         try { 
  24.             // 請求綁定 
  25.             binding = AbilityindexpageMetaDataBinding.requestBinding(this, request, this); 
  26.             // 獲得綁定的界面組件 
  27.             mainComponent = binding.getLayoutComponent(); 
  28.         } catch (DataSourceConnectionException e) { 
  29.             mainComponent = LayoutScatter.getInstance(this) 
  30.                     .parse(ResourceTable.Layout_error_layout, nullfalse); 
  31.         } 
  32.         setUIContent((ComponentContainer) mainComponent); 
  33.         mListContainer = (ListContainer) findComponentById(ResourceTable.Id_list_view); 
  34.         mTestListProvider = new TestListProvider(this); 
  35.  
  36.     } 
  37.  
  38.     @Override 
  39.     public void onActive() { 
  40.         super.onActive(); 
  41.     } 
  42.  
  43.     @Override 
  44.     public void onForeground(Intent intent) { 
  45.         super.onForeground(intent); 
  46.     } 
  47.  
  48.     @Override 
  49.     public void onDataLoad(List<MetaData> list, MetaDataRequestInfo.RequestItem requestItem) { 
  50.         if (list == null || requestItem == null) { 
  51.             return
  52.         } 
  53.         if (mListContainer != null) { 
  54.             mTestListProvider.initData(createAlarms(this, list)); 
  55.             mListContainer.setItemProvider(mTestListProvider); 
  56.         } 
  57.     } 
  58.     private List<TestRow> createAlarms(AbilitySlice context, List<MetaData> dataList) { 
  59.         List<TestRow> list = new ArrayList<>(); 
  60.         for (MetaData metaData : dataList) { 
  61.             TestRow item = new TestRow(context, metaData); 
  62.             list.add(item); 
  63.         } 
  64.         return list; 
  65.     } 
  66.     @Override 
  67.     public void onDataChange(List<MetaData> list, List<MetaData> list1, List<MetaData> list2, MetaDataRequestInfo.RequestItem requestItem) { 
  68.         if (list == null) { 
  69.             return
  70.         } 
  71.         mTestListProvider.addItems(createAlarms(this, list)); 
  72.     } 

容器組件綁定的話,我們實現(xiàn)了IMetaDataObserver接口,主要用于數(shù)據(jù)的加載及數(shù)據(jù)更新,在onDataLoad將Provider跟ListContainer進行綁定,如數(shù)據(jù)有發(fā)生變化,則onDataChange對列表進行更新,而在setSyncRequest傳參中我們改為false,表示為異步請求,因為IMetaDataObserver方法會異步執(zhí)行,如果傳Ture的話,會在onDataLoad方法執(zhí)行之后requestBinding方法才會返回,之后在請求綁定requestBinding方法中第三個參數(shù),dataCallback傳入this進行監(jiān)聽。

6.最終實現(xiàn)效果

【中軟國際】HarmonyOS 關(guān)于元數(shù)據(jù)綁定框架探索-鴻蒙HarmonyOS技術(shù)社區(qū)

7.添加數(shù)據(jù)只需要調(diào)用我們之前的**TestOperation.insertAnAlarm(binding)**方法就可以進行數(shù)據(jù)添加:

元數(shù)據(jù)表達式

在xml文件中進行元數(shù)據(jù)綁定時 metaDataBinding會用到多種表達式,具體用法如下:

總結(jié)

元數(shù)據(jù)綁定的簡單使用就介紹到這里,這里只跟大家展示了我們最常用的兩種布局的綁定,我們還可以進行自定義UI的綁定、自定義數(shù)據(jù)源等等更多的用法等著大家一起來探索。

回到我們最初的問題,元數(shù)據(jù)綁定框架跟DataBinding有什么區(qū)別?我個人理解是,元數(shù)據(jù)綁定框架是基于元數(shù)據(jù),而DataBinding則是綁定ActiveData(我們專欄有專門講解ActiveData的文章,歡迎大家前去查閱。),兩者的功能及數(shù)據(jù)源是不一樣的,可以針對自己的業(yè)務需求進行選擇。

但在Demo的編寫過程中,也發(fā)現(xiàn)了一個問題,同一個頁面普通UI組件和容器組件不能同事綁定,問題也時處在我們?nèi)萜鹘M件第5點所說的,實現(xiàn)了IMetaDataObserver接口進行異步請求,這點也希望跟大家一起繼續(xù)探索,歡迎在評論區(qū)共同探討。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-09-01 14:36:14

鴻蒙HarmonyOS應用

2011-08-25 16:28:23

Lua綁定系統(tǒng)

2021-09-01 10:37:25

鴻蒙HarmonyOS應用

2023-09-04 18:57:01

API接口數(shù)據(jù)中心

2021-09-13 09:20:20

前端框架VUE

2022-05-24 09:50:27

元宇宙藝術(shù)人工智能

2009-11-06 10:45:47

WCF服務元數(shù)據(jù)交換

2010-07-30 11:03:54

Flex數(shù)據(jù)綁定

2024-12-16 08:30:00

JVMJava虛擬機Java

2024-05-23 07:39:00

大數(shù)據(jù)TBDS數(shù)據(jù)湖

2025-03-31 01:30:00

Gin框架模型

2022-01-19 07:24:28

MetaCon元宇宙技術(shù)

2025-01-21 08:00:00

自適應框架框架開發(fā)

2024-04-02 09:55:36

GolangColly開發(fā)者

2023-10-20 09:42:43

人工智能元宇宙

2018-05-02 16:34:56

EAF嵌入式框架

2011-08-23 15:57:21

Lua元表元方法

2022-06-15 15:40:16

元宇宙

2023-02-01 13:23:00

AI自動化

2022-07-04 23:24:17

元宇宙虛擬世界倫理問題
點贊
收藏

51CTO技術(shù)棧公眾號

欧美日韩dvd在线观看| 国产日韩精品一区二区浪潮av| 欧美激情视频在线| www.久久国产| 亚洲欧美专区| 欧美日韩精品在线播放| 少妇精品久久久久久久久久| 性色av蜜臀av| 日韩成人av影视| 欧美丰满老妇厨房牲生活 | 精品久久免费视频| 精品国产一区二区三区小蝌蚪| 日韩一区和二区| 欧美污视频网站| 伦理在线一区| √…a在线天堂一区| 九九九九九精品| 无码久久精品国产亚洲av影片| 欧美日韩日本国产亚洲在线 | 国产精品日本一区二区| 少妇一级淫片日本| 亚洲免费网址| 久久久久久久一区二区| 2017亚洲天堂| 国产欧美一区| 亚洲乱亚洲乱妇无码| 亚洲妇女无套内射精| 激情亚洲小说| 91国产福利在线| 国产精品秘入口18禁麻豆免会员| av在线免费网址| 中文幕一区二区三区久久蜜桃| 九九九九九九精品| 日韩在线视频第一页| 国产美女娇喘av呻吟久久| 国产精品精品一区二区三区午夜版 | 欧美激情区在线播放| 中日韩一级黄色片| 色婷婷色综合| 这里只有精品视频| 亚洲久久久久久久| 欧美日韩xxxx| 亚洲人成电影在线观看天堂色| 午夜剧场免费看| 亚洲精品在线播放| 欧美一区二区三区不卡| 涩涩网站在线看| 亚洲欧洲日韩精品在线| 欧美美女bb生活片| 日韩视频在线观看一区二区三区| 国产一区二区三区四区五区3d| 在线观看中文字幕不卡| 农村妇女精品一二区| 神马电影网我不卡| 在线日韩一区二区| 一级片视频免费观看| 国产精品.xx视频.xxtv| 欧美日韩国产一二三| 中文字幕在线观看日| 国产精品白丝久久av网站| 91精品国产综合久久蜜臀| 999这里有精品| 国产精品一级在线观看| 日韩欧美高清一区| 北京富婆泄欲对白| 牛牛影视久久网| 亚洲色图美腿丝袜| 青青青视频在线播放| 国产高清久久| 九九久久久久99精品| 精品久久免费视频| 久久九九精品| 国产欧美一区二区三区视频| 国产剧情久久久| 丁香啪啪综合成人亚洲小说| 久久青青草综合| av在线电影观看| 亚洲人123区| 欧美一区二区三区爽大粗免费| 欧美一级二级视频| 日韩午夜中文字幕| 中文人妻一区二区三区| 99成人在线视频| 欧美—级a级欧美特级ar全黄| 天天插天天操天天干| 日韩在线a电影| 亚洲已满18点击进入在线看片 | 国产精品一区二区美女视频免费看| 欧美一区二区三区视频免费 | 97在线公开视频| 北条麻妃一区二区三区| 色一情一乱一伦一区二区三欧美 | 欧美亚洲第一页| 中文字幕人妻色偷偷久久| 国产精品一区二区三区乱码| 久久久久久久久四区三区| 欧美日韩在线看片| 精品日本高清在线播放| 中文字幕亚洲影院| 全球av集中精品导航福利| 色视频www在线播放国产成人| 精品无码人妻一区二区三区品| 天堂久久久久va久久久久| 91视频免费进入| www视频在线观看免费| 一区二区欧美国产| 欧美午夜aaaaaa免费视频| 999久久久精品一区二区| 亚洲性av在线| 中日韩黄色大片| 国产一区二区h| 色阁综合av| h片在线观看下载| 在线播放欧美女士性生活| 成人午夜剧场视频网站| 黄色精品免费| 91在线网站视频| 在线激情免费视频| 色婷婷av久久久久久久| 精品国产免费久久久久久婷婷| 欧美国产一级| 国产成人鲁鲁免费视频a| 少妇无码一区二区三区| 一区二区三区在线视频观看 | 国产午夜精品久久久久| 成人激情av网| 免费看黄色a级片| 日韩成人一区| 中文字幕av一区中文字幕天堂| 国产一级18片视频| 成人av中文字幕| 国产freexxxx性播放麻豆| 国产激情精品一区二区三区| 日韩最新免费不卡| 最新中文字幕第一页| 久久精子c满五个校花| 波多野结衣乳巨码无在线| av综合网站| 久久人人爽人人| 黄色三级网站在线观看| 一区二区国产盗摄色噜噜| www.日本久久| 综合天堂av久久久久久久| 91精品视频在线看| 国产原创视频在线观看| 91精品免费观看| 九九久久免费视频| 成人性生交大片免费看中文| 丁香色欲久久久久久综合网| 日韩在线观看中文字幕| 久久99青青精品免费观看| 精品国产av一区二区三区| 一区二区三区精密机械公司| 农村末发育av片一区二区| 在线高清一区| 欧美黄色直播| 亚洲成人av观看| 久久久久99精品久久久久| av免费观看在线| 亚洲国产cao| 泷泽萝拉在线播放| 日韩电影在线观看电影| 亚洲午夜久久久影院伊人| 亚洲伊人伊成久久人综合网| 欧美日韩国产va另类| 老牛影视av牛牛影视av| 黄网动漫久久久| 无码一区二区三区在线| 蜜臀久久久99精品久久久久久| 日本三级福利片| 91精品久久久久久综合五月天| 97视频免费在线观看| 男同在线观看| 在线观看91av| 国产福利拍拍拍| 国产欧美1区2区3区| 网站在线你懂的| 亚洲一区二区三区四区五区午夜| 日韩亚洲欧美精品| 日本一区二区乱| 欧美在线免费视频| 麻豆影院在线观看| 亚洲护士老师的毛茸茸最新章节| 奴色虐av一区二区三区| 亚洲欧美日韩中文字幕一区二区三区 | 3d性欧美动漫精品xxxx软件| www.欧美三级电影.com| 韩国av在线免费观看| 一本大道综合伊人精品热热 | 亚洲一区二区三区成人在线视频精品 | 日本久久久久久久久久久| 日本中文字幕视频在线| 亚洲国产私拍精品国模在线观看| 91黑人精品一区二区三区| 亚洲精品欧美专区| 全黄一级裸体片| 国产成人在线视频免费播放| 免费男同深夜夜行网站| 国产一区日韩欧美| 五月天婷亚洲天综合网鲁鲁鲁| 9999久久久久| 成人女保姆的销魂服务| 亚洲最大网站| 欧美巨大黑人极品精男| www.在线播放| 亚洲精品美女在线观看播放| 国产又粗又黄又爽视频| 一本一道综合狠狠老| 久久久精品视频免费观看| 欧美国产一区在线| 天天插天天射天天干| 国产精品一区二区无线| 国产精品久久a| 午夜亚洲激情| 很污的网站在线观看| 午夜精品一区二区三区国产| 日本在线成人一区二区| 日韩电影不卡一区| 国产精品一区二区av| 国产美女精品视频免费播放软件| 国产精品爱啪在线线免费观看| 51精品视频| 色综合五月天导航| 快射av在线播放一区| 在线午夜精品自拍| 精品亚洲成a人片在线观看| 日韩精品亚洲精品| 免费看日韩av| 精品国免费一区二区三区| 国产一区二区波多野结衣| 欧美三级日韩三级| 中文字幕av第一页| 在线一区二区三区| 日韩中文字幕高清| 欧美中文字幕一二三区视频| 午夜婷婷在线观看| 欧美性猛交xxxxx免费看| 日韩免费不卡视频| 五月综合激情网| 日韩成人一区二区三区| 亚洲国产精品一区二区久久| 久久久久噜噜噜亚洲熟女综合| 亚洲免费av高清| 四虎精品免费视频| 一区二区三区视频在线观看| 四虎永久免费在线| 亚洲一区在线播放| 久草国产精品视频| 懂色av一区二区三区| 国产又爽又黄的视频| 欧美日韩免费观看中文| 台湾佬中文在线| 在线视频综合导航| 亚洲最大成人在线视频| 777a∨成人精品桃花网| av综合在线观看| 亚洲第一视频网| 日本私人网站在线观看| 中文字幕亚洲色图| 四虎亚洲成人| 欧美亚洲另类激情另类| 日韩中文影院| 成人午夜在线影院| 91精品国产乱码久久久竹菊| 精品视频第一区| 国模吧精品视频| 99久re热视频精品98| 极品中文字幕一区| 99re在线视频免费观看| 麻豆成人久久精品二区三区小说| 亚洲理论中文字幕| 成a人片亚洲日本久久| 国产 欧美 在线| 亚洲天堂精品在线观看| 日韩欧美一区二区一幕| 欧美日韩视频在线第一区| 国产高清免费观看| 亚洲欧美激情精品一区二区| 欧美另类极品| 97免费中文视频在线观看| 欧美影视资讯| 国产精品三区在线| 日韩欧美精品一区| 国产97在线 | 亚洲| 日韩av中文字幕一区二区三区| 黄色三级视频在线播放| 93久久精品日日躁夜夜躁欧美| 欧美一区二区三区观看| 午夜精品福利一区二区三区av| 91视频在线视频| 欧美成人激情免费网| 成人网视频在线观看| 欧美激情视频一区| 日韩一级视频| 欧美黄色直播| 一区二区视频欧美| 依人在线免费视频| 91丨九色porny丨蝌蚪| 多男操一女视频| 色综合久久99| 亚洲精品人妻无码| 日韩日本欧美亚洲| 自拍偷拍亚洲视频| 91原创国产| 久久社区一区| 日日摸天天爽天天爽视频| 国产成人综合在线| 欧美乱大交做爰xxxⅹ小说| 欧美日韩精品在线播放| 亚洲精品成人电影| 久久精品国产96久久久香蕉| 午夜精品久久久久久久久久蜜桃| 国产精品99久久久久久久| 99久久亚洲精品蜜臀| 中文字幕在线导航| 26uuu国产在线精品一区二区| 久久艹精品视频| 91精品国产综合久久精品麻豆| 国产在线黄色| 欧洲午夜精品久久久| 国产女人18毛片水真多18精品| 色乱码一区二区三区熟女 | 中文字幕一区二区三区人妻在线视频 | 2019中文字幕在线电影免费 | 嫩草一区二区三区| 鲁一鲁一鲁一鲁一色| 国产成人h网站| 美国黄色小视频| 91精品国产aⅴ一区二区| 91短视频版在线观看www免费| 日韩av片永久免费网站| 婷婷成人综合| 凹凸国产熟女精品视频| www激情久久| 秋霞精品一区二区三区| 亚洲精品在线观看www| 中文字幕影音在线| 免费观看成人高| 亚洲欧美视频| 女尊高h男高潮呻吟| 一本久道中文字幕精品亚洲嫩| 欧美在线一卡| 国产a级全部精品| 成人激情电影在线| 在线观看国产福利| 亚洲欧洲三级电影| www.激情五月.com| 久久久久久网址| 台湾佬综合网| 亚洲视频在线观看一区二区三区| 国产欧美精品一区aⅴ影院| 日韩一级片中文字幕| 中文字幕亚洲在线| gogo大尺度成人免费视频| www.18av.com| av不卡在线播放| 日本熟女毛茸茸| 在线日韩av观看| 亚洲精品成人一区| 国产一区二区三区在线免费| 成人爱爱电影网址| 日韩手机在线视频| 久久天天躁夜夜躁狠狠躁2022| 136导航精品福利| 国产二级片在线观看| 国产欧美综合在线观看第十页| 中文字幕在线观看免费| 欧美成人免费网| 日本午夜精品久久久| 一本久道综合色婷婷五月| 最近中文字幕一区二区三区| 亚洲精品国产精品乱码不卡| 国产91精品高潮白浆喷水| 欧美精品系列| 97免费公开视频| 色综合夜色一区| 黄色免费在线观看| 国内精品视频在线播放| 蜜臀久久99精品久久久久久9| 九九热精品在线观看| 亚洲免费av网址| 国内精品视频| 日韩手机在线观看视频| 亚洲视频在线观看三级| av女名字大全列表| 成人精品视频99在线观看免费| 亚洲激情亚洲| 影音先锋男人看片资源| 亚洲成成品网站| 成人全视频免费观看在线看| 成年人视频网站免费| 久久久久久久电影| 性一交一乱一乱一视频| 国产精品国产亚洲伊人久久| 红桃视频国产精品| 福利视频第一页| 日韩电视剧免费观看网站| 高清一区二区三区av| 日日碰狠狠躁久久躁婷婷| 亚洲综合免费观看高清在线观看|