Android:日常學習筆記(8)———探究UI開發(5)

Android:日常學習筆記(8)———探究UI開發(5)

ListView控件的使用

ListView概述

  A view that shows items in a vertically scrolling list. The items come from the?ListAdapter?associated with this view.

1.關于ArrayAdapter:

ArrayAdapter<T> 是 ListAdapter的直接子類:一個由任意對象數組支持的具體的BaseAdapter。

一個支持任意對象數組的具體的BaseAdapter。默認情況下,這個類期望提供的資源id引用一個TextView。如果你使用更加復雜的布局, 使用需要字段id的構造函數。?That field id should reference a TextView in the larger layout resource.

However the TextView is referenced, it will be filled with the toString() of each object in the array. You can add lists or arrays of custom objects. Override the toString() method of your objects to determine what text will be displayed for the item in the list.

To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, override?getView(int, View, ViewGroup)?to return the type of view you want.

2.關于getView(int, View, ViewGroup)

獲得一個可以在指定位置顯示數據集中數據的視圖。你可以手動創作一個視圖也可以加載XML中的視圖。?When the View is inflated, the parent View (GridView, ListView...) will apply default layout parameters unless you use?inflate(int, android.view.ViewGroup, boolean)?to specify a root view and to prevent attachment to the root. ?

ListView的簡單用法

public class MainActivity extends AppCompatActivity {private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry",
"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry",
"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ArrayAdapter<String> adapter = new ArrayAdapter<String>
(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,data);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);} }

說明:

  ArrayAdapter通過泛型來指定要適配的數據類型,然后在構造函數中把當前上下文、ListView子項布局的ID、要適配的數據傳入。

  我們在這里使用了安卓的內置布局文件。

  ListView設置適配器,setAdapter(),將構建好的適配器對象傳進去,以此建立數據與ListView之間的關系。

定制ListView界面

1.定義一個實體類

public class Fruit {private String name;private int imageID;public Fruit(String name, int imageID) {this.name = name;this.imageID = imageID;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getImageID() {return imageID;}public void setImageID(int imageID) {this.imageID = imageID;}
}

2.自定義子項布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/fruit_img"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/fruit_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"/>
</LinearLayout>

3.編寫適配類

public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceID;public FruitAdapter(@NonNull Context context, @LayoutRes int resource, @IdRes int textViewResourceId, @NonNull List<Fruit> objects) {super(context, resource, textViewResourceId, objects);resourceID = textViewResourceId;}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Fruit fruit = getItem(position);View view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_img);TextView fruitText = (TextView) view.findViewById(R.id.fruit_text);fruitImage.setImageResource(fruit.getImageID());fruitText.setText(fruit.getName());return view;}
}

4.應用

public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList=new ArrayList<>();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.activity_main,R.layout.entry_fruit_item,fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);}public void initFruits(){for(int i=0;i<100;i++){fruitList.add(new Fruit("XXX",R.drawable.next_24px));}}
}

?提升ListView的運行效率

1.避免重復加載布局文件

在getView中加入如下代碼:

        //convertView用于將之前加載好的布局進行緩存,這里進行判斷,避免重復加載。if(convertView==null)view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);elseview =convertView;

2.避免重復查找控件

    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {Fruit fruit = getItem(position);View view;ViewHolder viewHolder;//convertView用于將之前加載好的布局進行緩存,這里進行判斷,避免重復加載。if(convertView==null){view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);viewHolder= new ViewHolder();viewHolder.fruitImage=(ImageView) view.findViewById(R.id.fruit_img);viewHolder.fruitText=(TextView) view.findViewById(R.id.fruit_text);view.setTag(viewHolder);}else{view =convertView;viewHolder= (ViewHolder) view.getTag();}viewHolder.fruitImage.setImageResource(fruit.getImageID());viewHolder.fruitText.setText(fruit.getName());return view;}
  //用于對控件的實例進行緩存
class ViewHolder{ImageView fruitImage;TextView fruitText;} }

ListView的點擊事件

        FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.activity_main,R.layout.entry_fruit_item,fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view, int position, long id) {Fruit fruit = fruitList.get(position);Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_LONG).show();}});

RecyclerView

使用RecyclerView

1.在build.gradle添加相應的依賴庫

  

2.點擊Sync Now進行同步。

3.修改XML布局文件

  

簡單使用

1.編寫適配器

public class FruitRecyclerAdapter extends RecyclerView.Adapter<FruitRecyclerAdapter.viewHolder> {private List<Fruit> fruitList;static class viewHolder extends RecyclerView.ViewHolder{ImageView fruitImage;TextView fruitText;public viewHolder(View itemView) {super(itemView);fruitImage = (ImageView) itemView.findViewById(R.id.fruit_img);fruitText = (TextView) itemView.findViewById(R.id.fruit_text);}}@Overridepublic viewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.entry_fruit_item,parent,false);viewHolder viewHolder = new viewHolder(view);return viewHolder;}//在每一個子項被滾動到屏幕內時執行
    @Overridepublic void onBindViewHolder(viewHolder holder, int position) {Fruit fruit = fruitList.get(position);holder.fruitText.setText(fruit.getName());holder.fruitImage.setImageResource(fruit.getImageID());}@Overridepublic int getItemCount() {return fruitList.size();}public FruitRecyclerAdapter(List<Fruit> fruitList) {this.fruitList = fruitList;}
}

?2.應用

public class RecyclerListActivity extends AppCompatActivity {private List<Fruit> fruitList =new ArrayList<>();protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initData();setContentView(R.layout.activity_recycler_list);RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);recyclerView.setLayoutManager(layoutManager);FruitRecyclerAdapter fruitRecyclerAdapter = new FruitRecyclerAdapter(fruitList);recyclerView.setAdapter(fruitRecyclerAdapter);}public void initData(){for(int i=0;i<30;i++){Fruit fruit = new Fruit("XXX",R.drawable.next_24px);fruitList.add(fruit);}}
}

?

實現橫向滾動

1.修改布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="100dp"android:layout_height="wrap_content"android:orientation="vertical"><ImageViewandroid:id="@+id/fruit_img"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/next_24px"android:layout_gravity="center_horizontal"/><TextViewandroid:id="@+id/fruit_text"android:text="XXXXX"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" />
</LinearLayout>

效果如右圖所示:

?2.在布局管理器中設置布局排布方式為水平

。。。protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initData();setContentView(R.layout.activity_recycler_list);RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(layoutManager);FruitRecyclerAdapter fruitRecyclerAdapter = new FruitRecyclerAdapter(fruitList);recyclerView.setAdapter(fruitRecyclerAdapter);}
。。。

說明:

  ListView的布局排列規則是由自己管理的,而RecyclerView則將這個工作交給了布局管理器,LayoutManager中置頂了一套可擴展的布局排列接口,子類只要按照接口的規范來實現,就能制定出各種不同排列方式的布局了。

瀑布流布局

效果:

  

代碼:

  StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);recyclerView.setLayoutManager(layoutManager);

處理點擊事件

    public viewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {View view=LayoutInflater.from(parent.getContext()).inflate(R.layout.entry_fruit_vertical_item,parent,false);final viewHolder viewHolder = new viewHolder(view);
        viewHolder.fruitView.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {int position = viewHolder.getAdapterPosition();Fruit fruit = fruitList.get(position);Toast.makeText(parent.getContext(),fruit.getName(),Toast.LENGTH_LONG).show();
            }});return viewHolder;}

說明:

  RecyclerView的強大之處在于,他可以輕松實現子項中任意控件或布局的點擊事件。

小結

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/MrSaver/p/6883465.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254533.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Geometric-Transformations圖像幾何變換halcon算子,持續更新

目錄affine_trans_imageaffine_trans_image_sizeconvert_map_typemap_imagemirror_imagepolar_trans_image_extpolar_trans_image_invprojective_trans_imageprojective_trans_image_sizerotate_imagezoom_image_factorzoom_image_sizeaffine_trans_image 功能&#xff1a;把任…

hibernate inverse屬性的作用

hibernate配置文件中有這么一個屬性inverse&#xff0c;它是用來指定關聯的控制方的。inverse屬性默認是false&#xff0c;若為false&#xff0c;則關聯由自己控制&#xff0c;若為true&#xff0c;則關聯由對方控制。見例子&#xff1a; 一個Parent有多個Child,一個Child只能有…

分布式鎖與實現(一)——基于Redis實現

概述 目前幾乎很多大型網站及應用都是分布式部署的&#xff0c;分布式場景中的數據一致性問題一直是一個比較重要的話題。分布式的CAP理論告訴我們“任何一個分布式系統都無法同時滿足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和…

淺析軟件項目管理中十個誤區(來自:http://manager.csdn.net/n/20051213/30907.html)

隨著計算機硬件水平的不斷提高&#xff0c;計算機軟件的規模和復雜度也隨之增加。計算機軟件開發從“個人英雄”時代向團隊時代邁進&#xff0c;計算機軟件項目的管理也從“作坊式”管理向“軟件工廠式”管理邁進。這就要求軟件開發人員特別是軟件項目管理人員更深一步地理解和…

倆孩隨筆

倆孩隨筆 有人給我貼了技術男加奶爸的標簽&#xff0c;不過這兩項都不是我的強項。我深知自己最大的長處在哪&#xff1a;普通&#xff0c;扔人堆里&#xff0c;不是認不出來&#xff0c;而是壓根看不著。想把事情做好&#xff0c;常常會用力過度。工作平平淡淡&#xff0c;需…

Inpainting圖像修復halcon算子,持續更新

目錄harmonic_interpolationinpainting_anisoinpainting_cedinpainting_ctinpainting_mcfinpainting_textureharmonic_interpolation 功能&#xff1a;對一個圖像區域執行諧波插值。 inpainting_aniso 功能&#xff1a;通過各向異性擴散執行圖像修復。 inpainting_ced 功能…

算法(偽代碼)的書寫

q ? Queue&#xff08;隊列&#xff09;, s ? Set&#xff08;集合&#xff09;pq ? PriorityQueue&#xff08;優先隊列&#xff09;d ? distance1. initialization 變量&#xff0c;數據結構的定義&#xff0c;及初始值的賦值&#xff1b;比如著名的 Dijkstra &#xff0…

第八次作業——系統設計與團隊分配(個人)

團隊作業地址&#xff1a;https://www.cnblogs.com/clio-hhhhhhl/p/9079157.html 個人碼云地址&#xff1a;https://gitee.com/Cliohl/events 團隊碼云地址&#xff1a;https://gitee.com/Cliohl/zhuoyue 項目進展&#xff1a; 上禮拜進展&#xff1a;把部分前端頁面實現出來&a…

深入理解Activity啟動流程(二)–Activity啟動相關類的類圖

本文原創作者:Cloud Chou. 歡迎轉載&#xff0c;請注明出處和本文鏈接 本系列博客將詳細闡述Activity的啟動流程&#xff0c;這些博客基于Cm 10.1源碼研究。 在介紹Activity的詳細啟動流程之前&#xff0c;先為大家介紹Activity啟動時涉及到的類&#xff0c;這樣大家可以有大概…

Lines色線halcon算子,持續更新

目錄bandpass_imagelines_colorlines_facetlines_gaussbandpass_image 功能&#xff1a;使用帶通濾波器提取邊緣。 lines_color 功能&#xff1a;檢測色線和它們的寬度。 lines_facet 功能&#xff1a;使用面模型檢測線。 lines_gauss 功能&#xff1a;檢測線和它們的寬…

疑問+軟件

問題 1學好軟件工程需要打好哪些基礎&#xff1f; 2怎樣學好軟件工程&#xff1f; 3軟件工程的發展前景如何&#xff1f; 4軟件工程具體能從事哪些職業&#xff1f; 5怎樣準確的找到自己的定位&#xff1f; 軟件 1支付寶 優點&#xff1a;支付便捷&#xff0c;轉賬方便&#xf…

成功的項目管理

內容提要 第一講 項目與項目管理 1.項目的基本概念 2.項目管理的概念 3.項目管理的重要性 第二講 項目管理的最新發展 1.現代項目管理的創立過程 2.現代項目管理的發展趨勢 3.項目管理流行的原因 第三講 信息時代的項目管理 1.信息時代的特點 2.信息時代項目管理的特點 3.按項目…

5月23日

11.1 LAMP架構介紹一、LAMP架構介紹LAMP是LinuxApache(httpd)MySQLPHP的簡寫&#xff0c;即把Apache、MySQL以及PHP安裝在linux系統上&#xff0c;組成一個運行環境來運行PHP腳本語言&#xff0c;通常是網站。比如Google、淘寶、百度、51cto博客、猿課論壇等就是用PHP語言寫出來…

Kotlin入門簡介

Kotlin的“簡歷” 來自于著名的IDE IntelliJ IDEA(Android Studio基于此開發) 軟件開發公司 JetBrains(位于東歐捷克)起源來自JetBrains的圣彼得堡團隊&#xff0c;名稱取自圣彼得堡附近的一個小島(Kotlin Island)一種基于JVM的靜態類型編程語言語法簡單&#xff0c;不啰嗦 1 2…

LaTeX基礎一:安裝與基本操作

一、安裝 1.首先下載texlive2015.iso文件。再在解壓的鏡像文件中運行install-tl-advanced.bat批處理命令。注意要關閉殺毒軟件&#xff0c;否則可能會出現錯誤。2.可以修改一下安裝路徑&#xff0c;只要更改一個&#xff0c;其他也隨之更改&#xff1a;3.把不要安裝的語言包去掉…

Match圖像匹配halcon算子,持續更新

目錄exhaustive_matchexhaustive_match_mggen_gauss_pyramidmonotonyexhaustive_match 功能&#xff1a;模板和圖像的匹配。 exhaustive_match_mg 功能&#xff1a;在一個分辨率塔式結構中匹配模板和圖像。 gen_gauss_pyramid 功能&#xff1a;計算一個高斯金字塔。 mono…

c++虛函數的前奏--函數指針與回調

聲明函數指針并實現回調程序員常常需要實現回調。本文將討論函數指針的基本原則并說明如何使用函數指針實現回調。注意這里針對的是普通的函數&#xff0c;不包括完全依賴于不同語法和語義規則的類成員函數&#xff08;類成員指針將在另文中討論&#xff09;。 聲明函數指針 …

你的微信,到底「連接」多少人?

作為一個技術人&#xff0c;用微信這么多年&#xff0c;也加了不少的好友和技術群。大半個月前&#xff0c;大概是5月初的時候&#xff0c;萌生了這個想法。 前后磕磕絆絆&#xff0c;經過了來美帝出差前期差點餓死、項目緊急期等艱難階段以及各種自學、溫習和設計&#xff0c;…

團隊項目第一周總結

團隊項目第一周總結 今天是周一&#xff0c;項目的進展周期已經進行了一周&#xff0c;做一個大概的總結吧。 周的工作先是定下團隊的項目方向&#xff0c;大家技術程度各有不同&#xff0c;因此想大一統的定下一個有些稍稍的花費時間。定好《基于大數據的日志分析》這個題目后…

電路寬度測量halcon例子

一個halcon處理的例子 目錄處理要求&#xff1a;原圖&#xff1a;處理程序&#xff1a;處理結果&#xff1a;處理要求&#xff1a; 根據客戶給的寬度&#xff0c;計算出電路寬度太窄的為NG 原圖&#xff1a; 處理程序&#xff1a; read_image (Image, 1.png) rgb1_to_gray(I…