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

鴻蒙UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)

開發(fā) 后端
相信對(duì)于IDE模板的解析相信能夠幫助我更好的運(yùn)用這些組件。我第一個(gè)解析的模板選擇了News_Ability模板。下面將分享我對(duì)這個(gè)模板的解析思路以及學(xué)習(xí)到的東西。

[[420493]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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

https://harmonyos.51cto.com

前言

學(xué)習(xí)鴻蒙已經(jīng)一個(gè)月了,這一個(gè)月學(xué)到了不少東西:服務(wù)卡片的制作,分布式數(shù)據(jù)庫,分布式任務(wù)調(diào)度等等。。。但是這一個(gè)月來都是一些碎片化的學(xué)習(xí)為多,需要什么才去學(xué)習(xí)什么。我想來一次更為系統(tǒng)的學(xué)習(xí),于是選擇從UI的制作開始一步步地學(xué)習(xí)。對(duì)于UI學(xué)習(xí),以為相比于文檔上面枯燥的說教(當(dāng)然文檔還是得好好看,畢竟基礎(chǔ)很重要),解析IDE里面所自帶的UI模板肯定是更加有趣的方式。事實(shí)上,解析模板比我想象中學(xué)習(xí)的東西要多,很多我以為是這樣做的,卻發(fā)現(xiàn)別人是那樣做的。相信對(duì)于IDE模板的解析相信能夠幫助我更好的運(yùn)用這些組件。我第一個(gè)解析的模板選擇了News_Ability模板。下面將分享我對(duì)這個(gè)模板的解析思路以及學(xué)習(xí)到的東西。如果想要查看更多詳細(xì)的學(xué)習(xí)筆記,

News_Ability模板中的布局與組件

布局:Directional布局

組件:Image,Text,TextField,ListContainer,ScrollView

布局分析

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

第一個(gè)頁面的分析:由圖片可見,第一個(gè)頁面主要就是兩個(gè)部分,一是新聞種類的選擇欄,二是新聞概覽的欄。一開始我天真的認(rèn)為新聞種類選擇欄是通過TabList實(shí)現(xiàn)的,但通過查看代碼發(fā)現(xiàn)這兩個(gè)板塊都是通過ListContainer實(shí)現(xiàn)的。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

第二個(gè)頁面分析:頁面的頂部是文章的題目,閱讀量和點(diǎn)贊數(shù),顯然都是用Text組件實(shí)現(xiàn),并且猜測是用一個(gè)水平方向得Directionnal組件裝起來得。接下來是一個(gè)ScrollView組件,使用這個(gè)組件的理由也很容易理解,文章的內(nèi)容無法保障在當(dāng)前屏幕就全部展示完畢,需要有一個(gè)把內(nèi)容下拉的組件。最底部就是評(píng)論輸入欄,以及點(diǎn)贊,轉(zhuǎn)發(fā),收藏(瘋狂暗示)等操作,查看代碼得知:分別是使用TextField,Image組件來實(shí)現(xiàn)的。

組件ListContainer的使用

組件ListContainer的使用相對(duì)比較復(fù)雜,我覺得還是有必要把文檔里面的東西搬運(yùn)一下。先呈上官方文檔官網(wǎng)文檔鏈接。

概括地來說,LisiContainer的使用有如下幾步

1.在layout目錄下,AbilitySlice對(duì)應(yīng)的布局文件page_listcontainer.xml文件中創(chuàng)建ListContainer。

  1. <ListContainer 
  2.     ohos:id="$+id:list_container" 
  3.     ohos:height="200vp" 
  4.     ohos:width="300vp" 
  5.     ohos:layout_alignment="horizontal_center"/> 

 2.在layout目錄下新建xml文件(例:item_sample.xml),作為ListContainer的子布局。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_content" 
  5.     ohos:width="match_parent" 
  6.     ohos:left_margin="16vp" 
  7.     ohos:right_margin="16vp" 
  8.     ohos:orientation="vertical"
  9.     <Text 
  10.         ohos:id="$+id:item_index" 
  11.         ohos:height="match_content" 
  12.         ohos:width="match_content" 
  13.         ohos:padding="4vp" 
  14.         ohos:text="Item0" 
  15.         ohos:text_size="20fp" 
  16.         ohos:layout_alignment="center"/> 
  17. </DirectionalLayout> 

 3.創(chuàng)建SampleItem.java,作為ListContainer的數(shù)據(jù)包裝類

  1. public class SampleItem { 
  2.     private String name
  3.     public SampleItem(String name) { 
  4.         this.name = name
  5.     } 
  6.     public String getName() { 
  7.         return name
  8.     } 
  9.     public void setName(String name) { 
  10.         this.name = name
  11.     } 

 4.ListContainer每一行可以為不同的數(shù)據(jù),因此需要適配不同的數(shù)據(jù)結(jié)構(gòu),使其都能添加到ListContainer上。創(chuàng)建SampleItemProvider.java,繼承自BaseItemProvider。必須重寫的方法如下:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

示例代碼如下:

  1. // 請(qǐng)根據(jù)實(shí)際工程/包名引入 
  2. import com.example.myapplication.ResourceTable; 
  3. import ohos.aafwk.ability.AbilitySlice; 
  4. import ohos.agp.components.*; 
  5. import java.util.List; 
  6. public class SampleItemProvider extends BaseItemProvider { 
  7.     private List<SampleItem> list; 
  8.     private AbilitySlice slice; 
  9.     public SampleItemProvider(List<SampleItem> list, AbilitySlice slice) { 
  10.         this.list = list; 
  11.         this.slice = slice; 
  12.     } 
  13.     @Override 
  14.     public int getCount() { 
  15.         return list == null ? 0 : list.size(); 
  16.     } 
  17.     @Override 
  18.     public Object getItem(int position) { 
  19.         if (list != null && position >= 0 && position < list.size()){ 
  20.             return list.get(position); 
  21.         } 
  22.         return null
  23.     } 
  24.     @Override 
  25.     public long getItemId(int position) { 
  26.         return position; 
  27.     } 
  28.     @Override 
  29.     public Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) { 
  30.         final Component cpt; 
  31.         if (convertComponent == null) { 
  32.             cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_item_sample, nullfalse); 
  33.         } else {  
  34.             cpt = convertComponent; 
  35.         } 
  36.         SampleItem sampleItem = list.get(position); 
  37.         Text text = (Text) cpt.findComponentById(ResourceTable.Id_item_index); 
  38.         text.setText(sampleItem.getName()); 
  39.         return cpt; 
  40.     } 

5.在Java代碼中添加ListContainer的數(shù)據(jù),并適配其數(shù)據(jù)結(jié)構(gòu)。

  1. @Override 
  2.  public void onStart(Intent intent) { 
  3.      super.onStart(intent); 
  4.      super.setUIContent(ResourceTable.Layout_page_listcontainer); 
  5.      initListContainer(); 
  6.  } 
  7.  private void initListContainer() { 
  8.      ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container); 
  9.      List<SampleItem> list = getData(); 
  10.      SampleItemProvider sampleItemProvider = new SampleItemProvider(list, this); 
  11.      listContainer.setItemProvider(sampleItemProvider); 
  12.  } 
  13.  private ArrayList<SampleItem> getData() { 
  14.      ArrayList<SampleItem> list = new ArrayList<>(); 
  15.      for (int i = 0; i <= 8; i++) { 
  16.          list.add(new SampleItem("Item" + i)); 
  17.      } 
  18.      return list; 
  19.  } 

 6.listContainer在sampleItemProvider 初始化后修改數(shù)據(jù)。

  1. private void initListContainer() { 
  2.      ListContainer listContainer = (ListContainer) findComponentById(ResourceTable.Id_list_container); 
  3.      List<SampleItem> list = getData(); 
  4.      SampleItemProvider sampleItemProvider = new SampleItemProvider(list, this); 
  5.      listContainer.setItemProvider(sampleItemProvider); 
  6.      list.add(new SampleItem("Item" + sampleItemProvider.getCount())); 
  7.      listContainer.setBindStateChangedListener(new Component.BindStateChangedListener() { 
  8.          @Override 
  9.          public void onComponentBoundToWindow(Component component) { 
  10.              // ListContainer初始化時(shí)數(shù)據(jù)統(tǒng)一在provider中創(chuàng)建,不直接調(diào)用這個(gè)接口; 
  11.              // 建議在onComponentBoundToWindow監(jiān)聽或者其他事件監(jiān)聽中調(diào)用。 
  12.              sampleItemProvider.notifyDataChanged(); 
  13.          } 
  14.  
  15.          @Override 
  16.          public void onComponentUnboundFromWindow(Component component) {} 
  17.      }); 
  18.  } 

新聞列表界面的解析

xml文件解析

新聞列表界面的UI效果如下圖:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

打開文件一看,里面有很多布局文件,但是想要知道呈現(xiàn)在我們眼前的這一畫面究竟是哪一個(gè)文件其實(shí)很簡單。因?yàn)槌绦蚴紫冗\(yùn)行的是MainAbility類,所以打開MainAbility類,可以看見下圖:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

上面這幅圖中setMainRoute方法指向了MainAbilityListSlice類,即路由到MainAbilityListSlice類上了,所以顯示在我們面前的畫面是MainAbilitySlice所加載的布局。于是,我們就繼續(xù)到MainAbilityListSlice類的代碼中去找設(shè)置布局的語句。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

哎,這不就是找到了這個(gè)布局到底是誰了嗎?接下來我們就可以到resources包里的layout文件夾中解析xml布局代碼了!我們點(diǎn)開這個(gè)xml布局文件:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

這是一個(gè)DirectionalLayout,方向是垂直的(vertical)。里面有兩個(gè)列表,一個(gè)是水平方向的,應(yīng)該就是新聞種類的選擇欄了,另一個(gè)在這里并沒有在這里顯式設(shè)定方向,不過顯然可以推斷這個(gè)就是新聞內(nèi)容概覽的列表。中間的Component我們暫時(shí)還不知道它的作用,不過,我們會(huì)知道的。既然已經(jīng)有了兩個(gè)ListContainer,根據(jù)上文我們對(duì)這個(gè)組件的認(rèn)識(shí),可以推斷肯定有兩個(gè)xml文件分別用來編輯這兩個(gè)ListContainer里面內(nèi)容的樣式的,查看layout文件夾里面的xml文件,根據(jù)文件名我們就可以推測哪兩個(gè)文件是用來編輯ListContainer里的內(nèi)容的樣式的。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

當(dāng)然,文件名只是起到幫助我們尋找的作用,想要更加嚴(yán)謹(jǐn)?shù)脑挘€是得到j(luò)ava代碼中去尋找語句,打開NewsTypeProvider類,可以看見如下語句,這便驗(yàn)證了我們的猜測了。(同理,另一個(gè)ListContainer也是這樣操作)

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

接下來就打開這些編輯樣式,打開之前,出于學(xué)習(xí)的目的,我想我們要先有一個(gè)自己大概的猜想,把打開文件作為一種驗(yàn)證的方法。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

新聞種類選擇欄很簡單,我猜測只有一個(gè)Text組件,事實(shí)也是這樣的。新聞概覽的樣式如上圖,由圖中我們猜測,這是由一個(gè)水平方向的Directional布局組織起來的額組件,里面放著一個(gè)用來顯示文章標(biāo)題的Text組件和一個(gè)用來顯示文章圖片的Image組件。接下來,讓我們來看看是不是這樣的吧!這里由于截圖大小的問題,就選擇把代碼復(fù)制下來。

  1. <DirectionalLayout 
  2.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  3.     ohos:height="110vp" 
  4.     ohos:width="match_parent" 
  5.     ohos:orientation="vertical"
  6.  
  7.     <!--水平的方向布局,是概覽的每一條新聞的樣式--> 
  8.     <DirectionalLayout 
  9.         ohos:height="109.5vp" 
  10.         ohos:width="match_parent" 
  11.         ohos:orientation="horizontal" 
  12.         ohos:padding="10vp"
  13.  
  14.         <!--文章標(biāo)題--> 
  15.         <Text 
  16.             ohos:id="$+id:item_news_title" 
  17.             ohos:height="match_content" 
  18.             ohos:width="0vp" 
  19.             ohos:max_text_lines="3" 
  20.             ohos:multiple_lines="true" 
  21.             ohos:right_padding="20vp" 
  22.             ohos:text_size="18vp" 
  23.             ohos:weight="3"/> 
  24.         <!--文章圖片--> 
  25.         <Image 
  26.             ohos:id="$+id:item_news_image" 
  27.             ohos:height="match_parent" 
  28.             ohos:width="0vp" 
  29.             ohos:scale_mode="stretch" 
  30.             ohos:weight="2"/> 
  31.  
  32.     </DirectionalLayout> 
  33.  
  34.     <Component 
  35.         ohos:height="0.5vp" 
  36.         ohos:width="match_parent" 
  37.         ohos:background_element="#FF162AAB" 
  38.         /> 
  39. </DirectionalLayout> 

We are almost right.但是,細(xì)心點(diǎn)就會(huì)發(fā)現(xiàn)這里有兩個(gè)問題:1.父布局是一個(gè)垂直方向的Directional布局,里面才包含一個(gè)水平方向的Directional子布局。2.除了我們的猜測之外,Component組件又出現(xiàn)了,并且它的底色是白色。也許到了有必要搞清楚Component組件是什么東西的時(shí)候了。在我學(xué)習(xí)布局的時(shí)候會(huì)經(jīng)常用到一個(gè)方法:改顏色。默認(rèn)顏色都是白色導(dǎo)致我們有時(shí)候很難分辨我們每個(gè)組件的大小,位置等,把顏色改成便于區(qū)分,花里胡哨的,會(huì)有利于我們這些初學(xué)者學(xué)習(xí)UI布局。

這里把Component的顏色改一下,就會(huì)發(fā)現(xiàn)它的作用類似于一個(gè)分界線,并且它是一條很細(xì)的線,這是因?yàn)樗膆eight只有0.5vp。那我們就改一改它的參數(shù),驗(yàn)證一下我們的猜想。讓我們整活起來:把底色改成喜慶的大紅,再把高度給他調(diào)成20vp。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

這里有一點(diǎn)需要注意的,因?yàn)楦季值母叨纫约捌渲幸粋€(gè)子Directional布局(并且這個(gè)布局在Component的上面)的高度已經(jīng)確定了,所以只更改一個(gè)參數(shù)是不夠的,再作如下更改:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

順便也把前面的Component組件的參數(shù)改一下,運(yùn)行效果如下:

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

好家伙,有點(diǎn)過年那味兒了,當(dāng)然我的心情也跟這顏色一樣喜慶,因?yàn)檫@不單驗(yàn)證了我的猜想,我還學(xué)會(huì)了新的布局方法:加一個(gè)Component組件來使各組件有一個(gè)分隔的效果!至此,xml文件我們已經(jīng)搞得清清楚楚了!接下來就去看看java代碼里面有什么可以學(xué)習(xí)的地方吧!

Java代碼解析

根據(jù)上面我們對(duì)ListContainer組件的初步認(rèn)識(shí),在完成了對(duì)xml文件的編輯之后的一步是創(chuàng)建數(shù)據(jù)包裝類。這個(gè)數(shù)據(jù)包裝類放在beans包里面,里面有NewsType和NewsInfo兩個(gè)類,前者很簡單,就不拆開看了,我們粗略地看一下后者。

【木棉花】UI學(xué)習(xí)(一)對(duì)Java布局模板News_Ability的解析(上)-鴻蒙HarmonyOS技術(shù)社區(qū)

數(shù)據(jù)封裝類中的屬性分別為:標(biāo)題,種類,圖片路徑,閱讀量,點(diǎn)贊量,內(nèi)容。剩下的是一些設(shè)置或者獲得這些屬性的方法。

下一步呢?是的,我們?nèi)タ纯碢rovider類吧,打開provider文件夾,挑選更為復(fù)雜一點(diǎn)的NewsListProvider類打開看看吧,這個(gè)類繼承自BaseItemProvider(BaseItemProvider文檔鏈接),且必須重寫四個(gè)方法。這個(gè)類有兩個(gè)屬性,一個(gè)是存放新聞信息的list,一個(gè)是上下文。類里面還藏有一個(gè)靜態(tài)內(nèi)部類ViewHolder。代碼如下

  1. public class NewsListProvider extends BaseItemProvider { 
  2.     private List<NewsInfo> newsInfoList; 
  3.     private Context context; 
  4.  
  5.     /** 
  6.      * constructor function 
  7.      * 
  8.      * @param listBasicInfo list info 
  9.      * @param context       context 
  10.      */ 
  11.     public NewsListProvider(List<NewsInfo> listBasicInfo, Context context) { 
  12.         this.newsInfoList = listBasicInfo; 
  13.         this.context = context; 
  14.     } 
  15.     //必須重寫的方法1:返回填充的表項(xiàng)個(gè)數(shù) 
  16.     @Override 
  17.     public int getCount() { 
  18.         return newsInfoList == null ? 0 : newsInfoList.size(); 
  19.     } 
  20.     //必須重寫的方法2:根據(jù)id(表項(xiàng)的位置)返回表項(xiàng) 
  21.     @Override 
  22.     public Object getItem(int position) { 
  23.         return newsInfoList.get(position); 
  24.     } 
  25.     //必須重寫的方法3:返回表項(xiàng)的id 
  26.     @Override 
  27.     public long getItemId(int position) { 
  28.         return position; 
  29.     } 
  30.     //必須重寫的方法4:根據(jù)id返回組件 
  31.     @Override 
  32.     public Component getComponent(int position, Component component, ComponentContainer componentContainer) { 
  33.         ViewHolder viewHolder; 
  34.         Component temp = component; 
  35.         //如果還沒有component,那么就進(jìn)行如下操作: 
  36.         if (temp == null) { 
  37.             //1.獲得組件的布局 
  38.             temp = LayoutScatter.getInstance(context).parse(ResourceTable.Layout_item_news_layout, nullfalse); 
  39.             //2.創(chuàng)建一個(gè)viewHolder,并設(shè)置它的屬性 
  40.             viewHolder = new ViewHolder(); 
  41.             //設(shè)置它的標(biāo)題:從temp中的布局找到里面的Text組件,并將其設(shè)置成這一個(gè)viewHolder的標(biāo)題 
  42.             viewHolder.title = (Text) temp.findComponentById(ResourceTable.Id_item_news_title); 
  43.             //設(shè)置它的圖片:從temp中的布局找到里面的Image組件,并將其設(shè)置成這一個(gè)viewHolder的圖片 
  44.             viewHolder.image = (Image) temp.findComponentById(ResourceTable.Id_item_news_image); 
  45.             //設(shè)置這個(gè)組件的標(biāo)簽,viewHolder就是這個(gè)組件的標(biāo)簽 
  46.             temp.setTag(viewHolder); 
  47.         } 
  48.         //如果已經(jīng)有component了,通過組件的標(biāo)簽來獲得viewHolder里面的內(nèi)容 
  49.         else { 
  50.             viewHolder = (ViewHolder) temp.getTag(); 
  51.         } 
  52.         viewHolder.title.setText(newsInfoList.get(position).getTitle()); 
  53.         viewHolder.image.setPixelMap(CommonUtils.getPixelMapFromPath(context, newsInfoList.get(position).getImgUrl())); 
  54.         //返回這個(gè)子組件 
  55.         return temp
  56.     } 
  57.  private static class ViewHolder 
  58.     { 
  59.         Text title; 
  60.         Image image; 
  61.     } 

每一語句的內(nèi)容都注釋到上面的代碼里面了,因此不再贅述。準(zhǔn)備工作都做好了,下面回到MainAbilityListSlice類中繼續(xù)看代碼。接下來一步,根據(jù)上面的ListContainer組件的使用方法,我們要在Java代碼中添加ListContainer的數(shù)據(jù),并適配其數(shù)據(jù)結(jié)構(gòu)。詳細(xì)的解析在代碼中,如下:

  1. private void initData() 
  2.    { 
  3.        //得到新聞?lì)愋偷臄?shù)據(jù),并創(chuàng)建一個(gè)類型為NewsType的列表來存放這些數(shù)據(jù),由于這些數(shù)據(jù)都放在路徑為"entry/resources/rawfile/news_type_datas.json"的json文件中,所以用如下語句提取 
  4.        List<NewsType> newsTypeList = 
  5.                ZSONArray.stringToClassList( 
  6.                        CommonUtils.getStringFromJsonPath(this, "entry/resources/rawfile/news_type_datas.json"), 
  7.                        NewsType.class); 
  8.        //得到所有新聞概覽的數(shù)據(jù),并創(chuàng)建一個(gè)類型為NewsInfo的列表來存放這些數(shù)據(jù),由于這些數(shù)據(jù)都放在路徑為"entry/resources/rawfile/news_datas.json"的json文件中,所以用如下語句提取 
  9.        totalNewsDataList = 
  10.                ZSONArray.stringToClassList( 
  11.                        CommonUtils.getStringFromJsonPath(this, "entry/resources/rawfile/news_datas.json"), 
  12.                        NewsInfo.class); 
  13.  
  14.        //創(chuàng)建一個(gè)用來存儲(chǔ)新聞數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)ArrayList 
  15.        newsDataList = new ArrayList<>(); 
  16.        newsDataList.addAll(totalNewsDataList); 
  17.  
  18.        //實(shí)例化下面兩個(gè)類 
  19.        newsTypeProvider = new NewsTypeProvider(newsTypeList, this); 
  20.        newsListProvider = new NewsListProvider(newsDataList, this); 
  21.    } 

然后就是設(shè)置響應(yīng)點(diǎn)擊的監(jiān)聽器,在這個(gè)模板中,點(diǎn)擊新聞種類欄的項(xiàng)可以篩選新聞,并且新聞種類項(xiàng)的樣式會(huì)發(fā)生變化,點(diǎn)擊新聞概覽的項(xiàng)可以跳轉(zhuǎn)到詳細(xì)頁面。由已經(jīng)有的代碼可以猜測前者是通過改變Listcontainer的項(xiàng)目的內(nèi)容來實(shí)現(xiàn),而后者則是通過帶參數(shù)的頁面跳轉(zhuǎn)來實(shí)現(xiàn)的。代碼及詳細(xì)注釋如下:

  1. private void initListener() { 
  2.        //新聞種類選擇欄的項(xiàng)被點(diǎn)擊時(shí)的回調(diào)事件 
  3.        selectorListContainer.setItemClickedListener( 
  4.                // 
  5.                (listContainer, component, position, id) -> { 
  6.                    //當(dāng)被點(diǎn)擊到,不著急變樣式,先獲得這個(gè)Text 
  7.                    setCategorizationFocus(false); 
  8.                    selectText = (Text) component.findComponentById(ResourceTable.Id_news_type_text); 
  9.                    //獲得完了,再進(jìn)行樣式變換 
  10.                    setCategorizationFocus(true);//樣式變換 
  11.                    //清除現(xiàn)有的newsDataList,為的是為下面更新newsDataList作準(zhǔn)備,這樣就可以做到跟新聞概覽框的內(nèi)容與新聞種類相對(duì)應(yīng) 
  12.                    newsDataList.clear(); 
  13.                    for (NewsInfo mTotalNewsData : totalNewsDataList) { 
  14.                        //把屬于當(dāng)前被點(diǎn)擊的新聞種類的新聞數(shù)據(jù)加進(jìn)newsDataList中,做到同步的效果 
  15.                        if (selectText.getText().equals(mTotalNewsData.getType()) || position == 0) { 
  16.                            newsDataList.add(mTotalNewsData); 
  17.                        } 
  18.                    } 
  19.                    //更新列表內(nèi)容 
  20.                    updateListView(); 
  21.                }); 
  22.        //新聞概覽表中的元素被點(diǎn)擊的時(shí)候,進(jìn)行跳轉(zhuǎn)操作 
  23.        newsListContainer.setItemClickedListener( 
  24.                (listContainer, component, position, id) -> { 
  25.                    Intent intent = new Intent(); 
  26.                    Operation operation = 
  27.                            new Intent.OperationBuilder() 
  28.                                    .withBundleName(getBundleName()) 
  29.                                    .withAbilityName(MainAbility.class.getName()) 
  30.                                    .withAction("action.detail"
  31.                                    .build(); 
  32.                    intent.setOperation(operation); 
  33.  
  34.                    //設(shè)置跳轉(zhuǎn)攜帶的參數(shù) 
  35.                    intent.setParam(MainAbilityDetailSlice.INTENT_TITLE, newsDataList.get(position).getTitle()); 
  36.                    intent.setParam(MainAbilityDetailSlice.INTENT_READ, newsDataList.get(position).getReads()); 
  37.                    intent.setParam(MainAbilityDetailSlice.INTENT_LIKE, newsDataList.get(position).getLikes()); 
  38.                    intent.setParam(MainAbilityDetailSlice.INTENT_CONTENT, newsDataList.get(position).getContent()); 
  39.                    intent.setParam(MainAbilityDetailSlice.INTENT_IMAGE, newsDataList.get(position).getImgUrl()); 
  40.                    startAbility(intent); 
  41.                }); 
  42.    } 

到此,第一個(gè)頁面的實(shí)現(xiàn)思路已經(jīng)被我們剖析得很清楚了。不知不覺已經(jīng)碼了8000字,如果再把第二個(gè)頁面在本貼中剖析,恐淪為“又長又臭”之作,因此決定把這個(gè)模板的解析分為兩篇文章,這樣大家讀起來也清晰一點(diǎn),我寫起來也輕松一點(diǎn)。那么就先對(duì)本文來個(gè)小結(jié)吧!

小結(jié)

1.在解析這個(gè)模板之前,我一直以為新聞種類欄使用的是Tablist組件來實(shí)現(xiàn)的。使用Tablist會(huì)出現(xiàn)的問題就是如果標(biāo)簽過多,多到溢出屏幕,無法做到滑動(dòng)就能夠查看的效果(如果可以做到,各位大佬能否指點(diǎn)一二?)。

2.解析過程中我學(xué)習(xí)到了ListContainer的使用方法,并且對(duì)其有了較為深刻的認(rèn)識(shí)。

3.解析思路,從MainAbility出發(fā),順藤摸瓜,遇到陌生的組件就去查看文檔,然后配合模板的實(shí)戰(zhàn)例子使用,效果杠杠的。點(diǎn)開詳細(xì)代碼前,須有自己的想法或者是大概的思路。

4.不了解的功能的組件可以通過設(shè)置一個(gè)辣眼睛的背景顏色來凸顯它,這個(gè)方法在自己寫布局的時(shí)候也很好用。

5.Component可作為分界的手段。

更多資料請(qǐng)關(guān)注我們的項(xiàng)目 :Awesome-HarmonyOS_木棉花

本項(xiàng)目會(huì)長期更新 ,希望隨著鴻蒙一同成長變強(qiáng)的既有我們,也有正在看著這個(gè)項(xiàng)目的你。明年3月,深大校園內(nèi)的木棉花會(huì)盛開,那時(shí),鴻蒙也會(huì)變的更好,愿這花開,有你我的一份。

文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載

UI_template_news_ability.zip

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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

https://harmonyos.51cto.com

 

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

2021-07-01 09:19:56

鴻蒙HarmonyOS應(yīng)用

2021-06-28 14:41:36

鴻蒙HarmonyOS應(yīng)用

2021-06-18 14:55:57

鴻蒙HarmonyOS應(yīng)用

2021-05-28 17:01:49

鴻蒙HarmonyOS應(yīng)用

2014-01-15 10:06:49

YahooNews Digest新聞客戶端

2022-02-17 21:05:26

AbilityJS FAJava PA

2020-11-17 11:48:44

HarmonyOS

2011-05-11 14:23:07

路由IS-IS

2011-04-22 11:00:17

運(yùn)維

2010-02-05 14:54:56

Android UI

2021-01-20 13:50:36

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-09-18 14:40:37

鴻蒙HarmonyOS應(yīng)用

2020-11-25 12:02:02

TableLayout

2010-08-05 13:14:16

Flex布局

2017-05-24 10:12:54

前端FlexboxCSS3

2010-09-02 13:53:58

CSS Sprites

2009-07-21 17:31:39

iBATIS一對(duì)多映射

2021-08-12 15:01:09

鴻蒙HarmonyOS應(yīng)用

2020-12-03 11:34:12

Ability vs

2010-02-01 10:40:13

Python Djan
點(diǎn)贊
收藏

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

亚洲综合视频在线观看| 亚洲神马久久| 欧美一区二区免费视频| 韩日视频在线观看| 国产福利小视频在线观看| 精品午夜一区二区三区在线观看| 九九热视频这里只有精品| 亚洲调教欧美在线| 日本一区二区中文字幕| 亚洲超丰满肉感bbw| 日韩欧美99| 丰满人妻熟女aⅴ一区| 丝袜诱惑亚洲看片 | 超碰免费在线播放| 久久综合久久99| 91中文字幕一区| 无码人妻丰满熟妇奶水区码| 午夜精品av| 中文字幕久久久av一区| 日批在线观看视频| 99热这里有精品| 91久久线看在观草草青青 | 黄色免费在线观看| 久久影院电视剧免费观看| 666精品在线| 最近中文字幕在线免费观看| 一本一本久久| 欧美黑人国产人伦爽爽爽| 91精品国自产在线| 色老板在线视频一区二区| 日韩午夜电影av| 国产免费又粗又猛又爽| 激情aⅴ欧美一区二区欲海潮| 亚洲欧洲av一区二区三区久久| 免费国产一区| 五月婷婷丁香六月| 丁香另类激情小说| 亚洲已满18点击进入在线看片| 国产美女www爽爽爽| 亚洲欧美bt| 97精品一区二区视频在线观看| 东京热无码av男人的天堂| 久草成人在线| 亚洲免费电影在线观看| 在线免费播放av| 久久婷婷国产| 日韩不卡在线观看| 亚洲调教欧美在线| 日韩av午夜| 日韩av网站导航| 国产激情第一页| 亚洲国产视频二区| 日韩欧美不卡一区| 91亚洲一线产区二线产区| 国产区一区二| 欧美成人伊人久久综合网| 中文字幕在线观看日| 黄色日韩网站| 91超碰这里只有精品国产| 91看片破解版| 美国十次综合久久| 欧美v亚洲v综合ⅴ国产v| 苍井空张开腿实干12次| 国产精品久久久久久久久久白浆| 亚洲国产精久久久久久| 久久国产精品无码一级毛片| 亚洲综合图色| 一区二区三区四区精品| 黄色av片三级三级三级免费看| 91麻豆国产自产在线观看亚洲 | 亚洲天堂av中文字幕| 成人网18免费网站| 日韩中文字幕在线| 天天鲁一鲁摸一摸爽一爽| 中文字幕日韩一区二区不卡| 欧美日韩成人免费| 日韩av大片在线观看| 久久久久国产精品午夜一区| 国产精品流白浆视频| 国产又粗又长又黄| 高清不卡一区二区在线| 久久久综合香蕉尹人综合网| 国产永久免费高清在线观看 | 日韩福利片在线观看| 亚洲欧美日韩精品一区二区| 国产精品视频网| www.日本在线观看| 91尤物视频在线观看| 四虎永久国产精品| 少女频道在线观看免费播放电视剧| 亚洲在线一区二区三区| 不卡影院一区二区| 粉嫩一区二区三区在线观看| 亚洲国产精品久久久久| 欧美福利第一页| 欧美性色综合| 国产精品扒开腿爽爽爽视频| 国产手机精品视频| 26uuu成人网一区二区三区| 亚洲国产综合自拍| 久久亚洲资源| 欧美中文字幕一区| 国产又黄又嫩又滑又白| 蜜桃一区二区三区| 欧美成人免费大片| 一级片在线免费播放| 国产成人免费在线| 色999五月色| 91视频欧美| 欧美高清视频在线高清观看mv色露露十八 | 日韩欧美一区二区视频在线播放| 天堂亚洲精品| 欧美日韩亚洲综合在线| 国产偷人妻精品一区| 中文在线播放一区二区| 国产精品女主播视频| 蜜桃91麻豆精品一二三区 | 亚洲欧美久久久久一区二区三区| 另类视频在线| 欧美一区2区视频在线观看| 国产人妻大战黑人20p| 亚洲手机视频| 国产在线高清精品| 国产视频福利在线| 欧美色另类天堂2015| 中文字幕一区二区三区人妻在线视频| 欧美精品一二| 日本中文字幕成人| 天天射,天天干| 亚洲综合色噜噜狠狠| 污网站在线免费| 国产在线日韩精品| 热门国产精品亚洲第一区在线| 免费av网站观看| 亚洲欧美乱综合| 亚洲免费av一区| 日韩黄色大片网站| 国产成人精品免高潮在线观看| 天天干天天干天天干| 亚洲电影第三页| 中国老熟女重囗味hdxx| 在线电影一区二区| 91免费视频网站| 老司机免费在线视频| 欧美日韩黄色影视| 日韩av片在线免费观看| 免费在线观看日韩欧美| 色女人综合av| 成人h在线观看| 伊人av综合网| 一道本无吗一区| 中文字幕在线观看一区| 亚洲欧美aaa| 一区二区国产在线| 99在线视频播放| 国产精品—色呦呦| 精品久久久久久久久久久久久久久 | 一区二区三区自拍| 潘金莲一级淫片aaaaa| 亚洲性感美女99在线| 国产精品露出视频| 碰碰在线视频| 国产亚洲一区二区精品| 自拍偷拍福利视频| 综合久久一区二区三区| 男插女视频网站| 红桃视频欧美| 久久久久久久久久码影片| 男人皇宫亚洲男人2020| 深夜福利亚洲导航| 国产成人精品毛片| 激情懂色av一区av二区av| 熟女少妇一区二区三区| 奇米777欧美一区二区| 在线视频欧美一区| 亚洲欧洲国产精品一区| 欧美亚洲第一页| 91在线网址| 日韩欧美综合一区| 欧美日韩一二三四区| 国产精品美女久久久久久久久| 午夜影院免费版| 亚洲区欧美区| 色婷婷精品国产一区二区三区| 日韩高清一区| 青青久久aⅴ北条麻妃| 午夜视频在线观看网站| 日韩欧美一区二区在线视频| 欧美在线观看不卡| 亚洲视频香蕉人妖| free性中国hd国语露脸| 蜜桃精品视频在线观看| 91精品国产91久久久久麻豆 主演| 免费欧美激情| av噜噜色噜噜久久| 亚洲成人va| 久久久爽爽爽美女图片| 日日夜夜精品一区| 亚洲国产精品嫩草影院久久| 一区二区三区亚洲视频| 精品福利樱桃av导航| 国产高清视频免费在线观看| 99riav一区二区三区| 天堂中文av在线| 噜噜噜91成人网| 免费极品av一视觉盛宴| 欧美精品一区二区三区精品| 国产私拍一区| 亚洲精品aa| 国产suv精品一区二区| 亚洲奶水xxxx哺乳期| 一本色道久久88综合日韩精品 | 亚洲性无码av在线| 黑人操亚洲女人| 在线播放中文一区| 五月婷婷激情五月| 欧美日韩激情小视频| 欧美日韩精品在线观看视频 | 欧美三级电影网址| 欧美亚洲第一区| 538在线视频| 麻豆一区二区在线观看| 91在线看黄| 一本色道久久综合狠狠躁篇的优点| 日韩一级在线播放| 日韩欧美久久一区| 97人妻精品一区二区三区动漫| 一本到不卡精品视频在线观看| 国产一级在线免费观看| 亚洲欧美日韩中文播放| 亚洲欧美另类日本| 国产精品日韩精品欧美在线| 成人免费无遮挡无码黄漫视频| 成人av影院在线| 日本久久久久久久久久| 国产一区二区三区精品视频| 中文字幕久久av| 麻豆国产精品官网| 亚洲涩涩在线观看| 极品少妇xxxx精品少妇| 亚洲一级片免费| 日本欧美韩国一区三区| 日韩无套无码精品| 久久xxxx| 熟妇人妻无乱码中文字幕真矢织江 | 久久久久久麻豆| www.自拍偷拍| 久久久久88色偷偷免费| 日本黄色特级片| 久久久精品综合| 极品蜜桃臀肥臀-x88av| 亚洲国产精品精华液ab| 手机看片国产日韩| 亚洲欧洲日韩女同| 少妇被躁爽到高潮无码文| 亚洲精品一二三四区| 91porn在线视频| 亚洲在线视频免费观看| 日本网站在线免费观看| 欧美日韩精品二区| 9i精品福利一区二区三区| 在线精品视频小说1| 波多野结衣激情视频| 欧美日韩一区国产| 国产www视频| 亚洲第一免费播放区| 日本福利午夜视频在线| 伊人久久五月天| 免费日本一区二区三区视频| 欧美高清视频在线播放| 看黄在线观看| 国产女精品视频网站免费| 粉嫩av国产一区二区三区| 福利视频一区二区三区| 亚洲人和日本人hd| 一道精品一区二区三区 | 欧美日韩第一视频| 色吧亚洲日本| 国产欧美一区二区三区在线看| 香蕉大人久久国产成人av| 久久久久久久久一区| 97国产精品| 老太脱裤子让老头玩xxxxx| 天堂久久久久va久久久久| 久久综合在线观看| 99精品热视频| 日韩精品久久久久久久的张开腿让| 亚洲麻豆国产自偷在线| 久久黄色精品视频| 欧美精品一二三四| 午夜av免费在线观看| 色偷偷噜噜噜亚洲男人的天堂| 黄色小说在线播放| 国产精品成人品| 2021年精品国产福利在线| 欧美日韩在线一二三| 欧美高清日韩| 国产精品wwwww| 成人美女视频在线看| 国产欧美一区二区三区在线观看视频| 亚洲午夜精品网| 亚洲天堂2021av| 亚洲免费影视第一页| 青青在线视频| 91精品国产综合久久香蕉922| 日韩av影院| 久艹在线免费观看| 精品制服美女久久| 蜜桃av免费看| 亚洲成人av一区| 国产乱淫a∨片免费观看| 国产亚洲精品激情久久| 草草在线视频| 91在线免费看片| 99国产**精品****| 无码少妇一区二区三区芒果| 国产精品中文有码| 黄色国产在线播放| 91成人网在线| 天堂在线免费av| 久久久综合免费视频| 精品久久亚洲| 国产精品h视频| 日本 国产 欧美色综合| www.色多多| 福利视频一区二区| 日本激情一区二区三区| 久久99久国产精品黄毛片入口| 国产福利亚洲| 亚洲国产欧美日韩| 日本一区中文字幕 | 欧美久久精品一级c片| 欧美亚洲国产成人| 99视频超级精品| 国产在线综合网| 日韩久久久精品| 视频在线这里都是精品| 999视频在线观看| 成人一二三区| 久热精品在线播放| 国产精品美女一区二区三区| 中文字幕在线播放日韩| 在线观看欧美成人| av亚洲一区| 一区二区冒白浆视频| 精品一区二区日韩| 日本黄色免费片| 777午夜精品免费视频| 韩国中文字幕在线| 亚洲伊人久久综合| 国产精品v日韩精品v欧美精品网站 | 国产午夜亚洲精品午夜鲁丝片| 日批视频免费在线观看| 国产午夜精品视频| 欧美韩国日本| 国产人妻互换一区二区| 国产91在线观看丝袜| 国产网站在线看| 日韩av中文字幕在线播放| 手机看片久久| 一区二区不卡在线视频 午夜欧美不卡'| 久久精品二区亚洲w码| 亚洲综合视频网站| 日韩午夜av一区| 老牛影视精品| 亚洲精品一区二区毛豆| 久久国产尿小便嘘嘘| 欧美国产精品一二三| 亚洲精品福利在线观看| 激情开心成人网| 一区二区三区日韩视频| 国产aⅴ综合色| 天天干天天干天天操| 中文字幕av一区中文字幕天堂 | 日本一区二区精品| 久久国产视频网| 国产做受高潮漫动| 在线亚洲午夜片av大片| 精品国产伦一区二区三区观看说明| 免费人成在线观看视频播放| 久久色在线观看| 国产精品福利电影| 91高潮在线观看| 国产精品videosex性欧美| 高清中文字幕mv的电影| 色综合激情五月| a级片国产精品自在拍在线播放| 国产日产精品一区二区三区四区 | 五月激情六月综合| 都市激情一区| 成人黄动漫网站免费| 玖玖视频精品| 欧美成人综合色| 在线电影中文日韩| 国产96在线亚洲| 超碰超碰在线观看| 欧美日韩国产一区二区| 国产乱色在线观看| 久久手机视频| 国产乱子伦一区二区三区国色天香 |