目錄:
1、布局模板
2、創建數據提供者實體類並且繼承 RecycleItemProvider 實現其方法
3、RecycleItemProvider是提供數據與組件關聯器來的方法
4、創建數據實體類
5、創建數據模板
6、獲取listContainer 並且綁定數據模板
當前教程項目地址 https://gitee.com/blueskyliu/hongmeng-os-actual-combat.git
建議看着代碼看我這個解釋
提供在屏幕上向上或向下滾動時顯示的列表容器。這個類繼承自ComponentContainer。它使用BaseItemProvider或RecycleItemProvider來存儲對象
根據上面的定義我們得知 ListContainer 是列表容器,用來渲染重復性布局的容器
渲染條件
1.布局模板
官方推薦使用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>
-
創建數據提供者實體類並且繼承 RecycleItemProvider 實現其方法
提供一個RecycleItemProvider對象,以將ComponentProvider項與組件的基本數據關聯起來。回收器適配器擴展了BaseItemProvider。數據集中的每個組件項都可以使用它來釋放內存資源。
-
根據上面的定義我們得知 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);
}
}
}
- 創建數據實體類
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;
}
}
- 創建數據模板
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;
}
}
-
獲取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/