目錄:java
一、佈局模板git
二、建立數據提供者實體類而且繼承 RecycleItemProvider 實現其方法數組
三、RecycleItemProvider是提供數據與組件關聯器來的方法緩存
四、建立數據實體類app
五、建立數據模板ide
當前教程項目地址 https://gitee.com/blueskyliu/hongmeng-os-actual-combat.git佈局
建議看着代碼看我這個解釋post
提供在屏幕上向上或向下滾動時顯示的列表容器。這個類繼承自ComponentContainer。它使用BaseItemProvider或RecycleItemProvider來存儲對象測試
根據上面的定義咱們得知 ListContainer 是列表容器,用來渲染重複性佈局的容器
渲染條件
- 佈局模板
官方推薦使用xml來寫佈局這裏咱們也用的是xml寫模板佈局
<?xml version="1.0" encoding="utf-8" ?> <DirectionalLayout xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:id="$+id:dynamicitem" ohos:height="match_content" ohos:width="match_parent" > <!-- 第一層--> <DirectionalLayout ohos:width="match_parent" ohos:height="match_content" ohos:orientation="horizontal" > <DirectionalLayout ohos:width="match_parent" ohos:height="match_content" ohos:orientation="horizontal" > <Image ohos:height="40vp" ohos:width="40vp" ohos:image_src="$media:log.png" ohos:scale_mode="stretch" ></Image> <DirectionalLayout ohos:width="match_parent" ohos:height="match_content" > <Text ohos:text_size="19fp" ohos:width="match_content" ohos:height="match_content" ohos:text_color="#FFFFFF" ohos:text="藍天的測試" ohos:id="$+id:authname" ohos:scale_mode="stretch" ></Text> <DirectionalLayout ohos:orientation="horizontal" ohos:width="match_content" ohos:height="match_content" > <Image ohos:height="10vp" ohos:width="10vp" ohos:image_src="$media:log.png" ohos:scale_mode="stretch" ></Image> <Text ohos:text_size="19fp" ohos:width="match_content" ohos:height="match_content" ohos:text_color="#FFFFFF" ohos:text="鄭州市金水區" ></Text> </DirectionalLayout> </DirectionalLayout> </DirectionalLayout> </DirectionalLayout> </DirectionalLayout>
2. 建立數據提供者實體類而且繼承 RecycleItemProvider 實現其方法
提供一個RecycleItemProvider對象,以將ComponentProvider項與組件的基本數據關聯起來。回收器適配器擴展了BaseItemProvider。數據集中的每一個組件項均可以使用它來釋放內存資源。
3. 根據上面的定義咱們得知 RecycleItemProvider是提供數據與組件關聯器來的方法
package com.example.myapplication2048.itemprovider; import com.example.myapplication2048.ResourceTable; import com.example.myapplication2048.datamodel.DynamicItemInfo; import ohos.agp.components.*; import ohos.app.AbilityContext; import ohos.app.Context; import java.util.List; public class DynamicProvider extends RecycleItemProvider { /** * 卡片盒子模型 */ private List<DynamicItemInfo> dynamicModels; /** * 應用程序能夠使用AbilityContext來獲取資源、啓動能力、 * 建立或獲取線程模型,以及獲取應用程序包信息和運行信息。 * 一個能力就是ability context的一個實例。 * 總之只要操做就須要getcontext 由於他須要這個環境 就比如人對水的需求 蓋房子 作飯 都須要水同樣 */ public DynamicProvider(List<DynamicItemInfo> dynamicModels) { this.dynamicModels = dynamicModels; } /** * : * @return獲取提供程序中數據項的總數 */ @Override public int getCount() { return dynamicModels.size(); } /** * : * @return獲取位於數據集中指定位置的數據項。 */ @Override public DynamicItemInfo getItem(int i) { return dynamicModels.get(i); } /** * : * @return 獲取數據集中指定位置的數據項的行ID。 */ @Override public long getItemId(int i) { return i; } /** * 獲取在數據集中指定位置顯示數據的組件。 * @param i 指示組件在數據集中的位置。 * @param component 表示前一個須要重用的組件。若是沒有這樣的組件,這個參數能夠爲空。 * @param componentContainer 匹配要獲取組件的父組件。 * @return */ @Override public Component getComponent(int i, Component component, ComponentContainer componentContainer) { Component parse = component; //默認 component ==null 第一次的時候 /** * LayoutScatter * 您能夠使用該工具在XML文件中定義一個組件, * 而後調用parse(int, ohos.agp.components.ComponentContainer, boolean) * 方法來使用該文件生成一個組件對象。 * parse 公共組件解析(int xmlId, ComponentContainer根,boolean attachToRoot) * 將XML文件轉換爲組件。 * */ /** * parse * 參數1 組件id * 參數2 跟組件 就是當前容器 父組件。 */ Dynamicitem dynamicitem;//初始化 if (parse==null){ //獲取上下文 這裏獲取的是父組件 就是 ListContainer 上下文 Context context = componentContainer.getContext(); //獲取xml 佈局模板 parse = LayoutScatter.getInstance(context) .parse(ResourceTable.Layout_dynamicitem, componentContainer, false); //指明給哪一個模板容器添加數據 dynamicitem = new Dynamicitem(parse); parse.setTag(dynamicitem);//將佈局模板寫入緩存 下次調用使用 不用重複查詢模板 }else { //第二次進來有緩存 dynamicitem =(Dynamicitem) parse.getTag(); } //給佈局模板裏面的組件添加數據 dynamicitem.textAUTH.setText(dynamicModels.get(i).getAuthor()); //綁定完成 返回當前模板 return parse; } /** * 動態卡片容器 */ public static class Dynamicitem { Text textAUTH;//初始化組件 Dynamicitem(Component itemComponent){ //獲取模板裏面的 組件 textAUTH = (Text) itemComponent.findComponentById(ResourceTable.Id_authname); } } }
4. 建立數據實體類
package com.example.myapplication2048.datamodel; /** * 動態數據模型 */ public class DynamicItemInfo { // true 關注 false 沒關注 private boolean isFocusOn; //用戶名 private String author; //用戶頭像 private String authorImgUrl; //建立時間 private Long create_date; // true 點贊 false 沒點贊 private boolean isPraise; //點贊數量 private Integer praiseNum; //評論數量 private Integer commentsNum; //熱度數量 private Integer hotNum; public DynamicItemInfo(boolean isFocusOn, String author, String authorImgUrl, Long create_date, boolean isPraise, Integer praiseNum, Integer commentsNum, Integer hotNum) { this.isFocusOn = isFocusOn; this.author = author; this.authorImgUrl = authorImgUrl; this.create_date = create_date; this.isPraise = isPraise; this.praiseNum = praiseNum; this.commentsNum = commentsNum; this.hotNum = hotNum; } @Override public String toString() { return "dynamicModel{" + "isFocusOn=" + isFocusOn + ", author='" + author + '\'' + ", authorImgUrl='" + authorImgUrl + '\'' + ", create_date=" + create_date + ", isPraise=" + isPraise + ", praiseNum=" + praiseNum + ", commentsNum=" + commentsNum + ", hotNum=" + hotNum + '}'; } public boolean isFocusOn() { return isFocusOn; } public void setFocusOn(boolean focusOn) { isFocusOn = focusOn; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getAuthorImgUrl() { return authorImgUrl; } public void setAuthorImgUrl(String authorImgUrl) { this.authorImgUrl = authorImgUrl; } public Long getCreate_date() { return create_date; } public void setCreate_date(Long create_date) { this.create_date = create_date; } public boolean isPraise() { return isPraise; } public void setPraise(boolean praise) { isPraise = praise; } public Integer getPraiseNum() { return praiseNum; } public void setPraiseNum(Integer praiseNum) { this.praiseNum = praiseNum; } public Integer getCommentsNum() { return commentsNum; } public void setCommentsNum(Integer commentsNum) { this.commentsNum = commentsNum; } public Integer getHotNum() { return hotNum; } public void setHotNum(Integer hotNum) { this.hotNum = hotNum; } }
5. 建立數據模板
package com.example.myapplication2048.datamodel; import java.util.ArrayList; import java.util.List; import java.util.stream.IntStream; public class DynamicViewModel { private List<DynamicItemInfo> dataItemList = new ArrayList<>(); public DynamicViewModel() { IntStream.range(0,2) .forEach(index->dataItemList.add( new DynamicItemInfo(false,"藍天","adfa",123123L ,true,12,12,2))); } public List<DynamicItemInfo> getDataItemList() { return dataItemList; } }
6. 獲取listContainer 而且綁定數據模板
本案例這串代碼須要寫在 MainAbilitySlice 生命週期的 onStart 在子頁面剛加載的時候調用便可
//獲取listContainer ListContainer listContainerDynamic =(ListContainer) findComponentById(ResourceTable.Id_list_container); //實例化數據模板 DynamicViewModel viewModel = new DynamicViewModel(); //獲取模板數組 List<DynamicItemInfo> dataItemList = viewModel.getDataItemList(); //模板數組傳入數據提供者實體類 DynamicProvider dynamicProvider = new DynamicProvider(dataItemList); //將數據提供者與listContaienr 綁定 listContainerDynamic.setItemProvider(dynamicProvider);
做者:BLUESKYHOST
想了解更多內容,請訪問51CTO和華爲合做共建的鴻蒙社區: https://harmonyos.51cto.com