android listview 滑動條顯示_第七十六回:Android中UI控件之RecyclerView基礎

各位看官們,大家好,上一回中咱們說的是Android中UI控件之ListView優化的例子,這一回咱們說的例子是UI控件之RecyclerView。閑話休提,言歸正轉。讓我們一起Talk Android吧!

看官們,我們在前面章回中介紹了ListView組件,今天我們將介紹ListView組件的升級版:RecyclerView組件。之所以叫它升級版本是因為它是官方推出的組件,而且官方推薦使用它來替代ListView組件。它雖然和ListView一樣是用來在有限的屏幕空間內滾動顯示大量數據,但是它比ListView的顯示效率高,因為它每次只創建一個屏幕可以顯示的列表,當滑動屏幕時,它自動銷毀從屏幕中消失的列表,然后再創建新的列表顯示到屏幕中,這樣循環往復。細看一下這操作就和它的名字一樣,如果和數據結構對比的話,就有點循環隊列的意思。接下來我們通過文本結合代碼的方式來介紹如何使用RecyclerView組件。

  • 1.在布局文件中添加RecyclerView組件。通常是在Activity或者Fragment的布局文件中添加。添加時需要使用完整包名,因為它是support庫中的東西。代碼如下:
    <android.support.v7.widget.RecyclerViewandroid:id="@+id/id_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
  • 2.在代碼中加載RecyclerView組件的布局。通常是在Activity的onCreate方法或者Fragment的onCreateView方法中加載它的布局,這和普通組件的加載方法相同:
    //獲取RecyclerView控件,該控件定義于上面的布局中mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);    
  • 3.設置LayouManager。使用該組件的setLayoutManager方法。代碼如下:
     mRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
  • 4.創建適配器(Adapter)對象,并且為RecyclerView設置Adapter。具體的代碼如下:
    //把Recylerview和adapter關聯起來,CustomAdapter稍后介紹mRecyclerView.setAdapter(new CustomAdapter(mData));    

簡單起見,在這里的把mData定義成一個數組,在實際中可以依據項目需求來定義。但是不管如何定義,它都要和適配器的構造函數保持一致,不然沒有辦法把數據傳遞給適配器。此外,這也是可以進行擴展的地方,我們將在后面章回中介紹,下面是與mData相關的代碼:

    private String[] mData = new String[50];for(int i=0; i<50;++i){mData[i]= "This is item "+(i+1);}

接下來該適配器出場了,代碼中的CustomeAdapter類是RecyclerView.Adapter的子類,也就是說RecyclerView已經把適配器的規范定義好了,我們只需要按照規范去實現就可以,那么有哪些規范呢?規范主要是實現一個ViewHolder(這個不陌生吧),并且重寫onCreateViewHolder()方法,onBindViewHolder()方法和getItemCount。

  1. onCreateViewHolder方法主要是加載布局文件和創建ViewHolder;這里的布局文件指Recycler包含的布局,也就是顯示到屏幕中的布局。
  2. onBindViewHolder方法主要是為RecyclerView包含的布局中各個控件添加數據,進而實現數據和視圖的連接操作(也可以理解為更新數據)。
  3. getItemCount方法主要是獲取RecyclerView中條目的數量,這個數量是指所有數據的數量,而不是在屏幕上顯示數據的數量。

下面是代碼,不過首先要創建一個布局文件,用來顯示RecyclerView中每行或者每列顯示的內容,至于布局中顯示哪些的內容可以依據項目需求來定。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/id_recy_view_item_text"android:layout_width="wrap_content"android:layout_height="18dp"/>
</LinearLayout>

我們創建了一個叫recycler_view_layout的布局文件,簡單起見,我們只放了一個文本組件,用來顯示一行文本內容。布局創建好以后,接下就是重頭戲:創建適配器。

//注意適配器是泛型
public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>{ //自己定義的數據容器,這里使用簡單的字符串數組,
//可以是list或者其它容器,容器中的數據類型可以自己定義private String[] mStrings; //定義ViewHolder,繼續自RecyclerView的ViewHolderpublic static class CustomViewHolder extends RecyclerView.ViewHolder{//RecyclerView中每一個子項包含的組件,也就是RecyclerView每行或者每列顯示的內容public TextView tv; //ViewHolder就是一個數據容器public CustomViewHolder(View v){super(v);//獲取RecyclerView中的組件tv =(TextView) v.findViewById(R.id.id_recy_view_item_text);}public TextView getTextView(){return tv;}}//重寫適配器的構造器,目的是把數據傳入到適配器中public CustomAdapter(String[] strings){if(strings != null) {mStrings = strings;}}@Overridepublic CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//獲取View對象,這里的布局就是剛才創建的,看布局id就能明白。//它用來顯示Recylerview中具體的列表項View view = LayoutInflater.from(parent.getContext()).inflate (R.layout.recycler_view_layout,parent,false);//創建viewHoldCustomViewHolder customViewHolder = new CustomViewHolder(view); //返回ViewHolderreturn customViewHolder;  }@Overridepublic void onBindViewHolder(CustomViewHolder holder, int position) {//通過position參數獲取列表項在Recylerview中的位置,然后更新該位置的數據holder.getTextView().setText(mStrings[position]); }@Overridepublic int getItemCount() {//這個長度比較重要,如果為0,那么recylerview中不會有任何數據顯示。return mStrings.length;}
}

上面的代碼,完全是按照RecyclerView.Adapter的規范來寫的,這和ListView不一樣,我們可以自己擴展。另外,我們還創建了一個布局文件,用來顯示RecyclerView中每一項的內容,該布局不像ListView一樣可以使用系統提供的,因為系統沒有提供,只能自己定義。

此外,RecyclerView組件是support庫中的東西,它不在SDK中,使用該組件時需要添加支持庫,可以手動修改app目錄下的build.gradle文件,在dependencies中添加:

compile 'com.android.support:recyclerview-v7:25.1.0'

或者修改項目配置,AST會自動修改gradle文件。修改步驟: AST Menu->File->ProjectStructure->app.

不過添加的Recyclerview組件要和support庫的版本一致,不然會出現不兼容的問題。我使用的版本如下:

    compile 'com.android.support:appcompat-v7:25.1.0'compile 'com.android.support:recyclerview-v7:25.1.0'

下面是程序運行的結果,請參考:

v2-cc86b960b482b861fdb3a8e4acf63145_b.jpg

各位看官,關于Android中UI控件之RecyclerView基礎的例子咱們就介紹到這里,欲知后面還有什么例子,且聽下回分解!

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

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

相關文章

數據建模大數據就業挑戰月薪30K

點擊關注 異步圖書&#xff0c;置頂公眾號每天與你分享 IT好書 技術干貨 職場知識本文大概 10624 字讀完共需 30 分鐘Tips 參與文末話題討論&#xff0c;即有機會獲得異步圖書一本。數據建模是對現實世界各類數據進行抽象組織、界定數據庫需管轄的范圍、確定數據的組織形式等直…

Hive的數據模型-管理表

概述 管理表&#xff0c;也稱作內部表,受控表。 所有的 Table 數據&#xff08;不包括 External Table&#xff09;都保存在warehouse這個目錄中。 刪除表時&#xff0c;元數據與數據都會被刪除。 在加載數據的過程中&#xff0c;實際數據會被移動到數據倉庫目錄中&#xff1b…

mft按鈕設計_火力發電廠典型MFT邏輯控制實現.pdf

火力發電廠典型MFT邏輯控制實現.pdf火力發電廠典型MFT邏輯控制實現劉文豐 陳思銘湖南省電力試驗研究院 (湖南長沙410007)摘要&#xff1a;以金竹山電廠擴建工程國產2600MW亞臨界機組為例&#xff0c;概述了必力發電廠FSSS中典型MFT的原理及重要性&#xff0c;詳細介紹各MFT條件…

oracle schema_oracle數據庫全局統計更新

--oracle數據庫優化 替換用戶名 user&#xff0c;在該用戶下執行begindbms_stats.gather_schema_stats(ownname >USER,options > GATHER,estimate_percent > dbms_stats.auto_sample_size,method_opt > for all columns size skewonly,degree > 7 );end;————…

python操作三大主流數據庫(12)python操作redis的api框架redis-py簡單使用

python操作三大主流數據庫(12)python操作redis的api框架redis-py簡單使用 redispy安裝安裝及簡單使用&#xff1a;https://github.com/andymccurdy/redis-pyapi參考文檔&#xff1a;http://redis-py.readthedocs.io/en/latest/ 1.安裝redis-py pip install redis C:\Users\ajie…

Hive的數據模型-外部表

概述 包含External 的表叫外部表 刪除外部表只刪除metastore的元數據&#xff0c;不刪除hdfs中的表數據 外部表 只有一個過程&#xff0c;加載數據和創建表同時完成&#xff0c;并不會移動到數據倉庫目錄中&#xff0c;只是與外部數據建立一個鏈接。當刪除一個 外部表 時&…

對github的初步認識以及對軟件技術基礎課程的期待

對github的初步認識&#xff1a; Git是一個開源的分布式版本控制系統&#xff08;版本控制是一種記錄一個或若干文件內容變化&#xff0c;以便將來查閱特定版本修訂情況的系統&#xff09;&#xff0c;客戶端并不只提取最新版本的文件快照&#xff0c;而是把代碼倉庫完整地鏡像…

centos默認安裝mysql_centos6.x默認安裝mysql5.7

1. yum 安裝 mysql5.7 yum 源yum localinstall mysql57-community-release-el6-8.noarch.rpm2. 查看是否成功安裝MySQL Yum Repositoryyum repolist enabled|grep ""mysql.*-community.*3. 安裝mysqlyum install mysql-community-server4.開啟數據庫服務service mys…

Hive的數據模型-分區表

需求 select * from t1 where xxxx; 這是全表掃描的。實際應用中&#xff0c;有時候不一定需要全表掃描。 比如電信的日志文件&#xff0c;一個表里存了從去年到現在的日志文件&#xff0c;那是很多很大的&#xff0c;實際需求要查今天的&#xff0c;如果用上面的sql&#xf…

arduino 停止程序_建立Arduino機器人,第五部分:障礙規避

歡迎閱讀教程系列的第五篇文章&#xff0c;其中我正在構建一個基于遙控Arduino的車輛機器人。這是我到目前為止發表的文章列表&#xff1a;第一部分&#xff1a;硬件組件第二部分&#xff1a;Arduino編程第三部分&#xff1a;組裝機器人第四部分&#xff1a;A(不是那樣)基本機器…

debug error怎么解決_我要以血和淚的經歷告訴你,這個 bug 太難解決了

[npm install報錯: npm WARN tar ENOENT: no such file or directory]npm installnpm WARN deprecated request2.88.2: request has been deprecated, see request/request#3142npm WARN deprecated mkdirp0.5.1: Legacy versions of mkdirp are no longer supported. Please u…

Yarn簡單介紹及內存配置

在這篇博客中&#xff0c;主要介紹了Yarn對MRv1的改進&#xff0c;以及Yarn簡單的內存配置和Yarn的資源抽象container。我么知道MRv1存在的主要問題是&#xff1a;在運行時&#xff0c;JobTracker既負責資源管理又負責任務調度&#xff0c;這導致了它的擴展性、資源利用率低等問…

mysql計算時間函數_mysql時間計算函數

當前一個業務需求&#xff0c;需要查找創建在三天以前的數據&#xff0c;表中是存了一個創建時間的&#xff1b;這個需求看起來很簡單&#xff0c;直接全部查找出來然后用代碼根據時間篩選一下就可以了。但這只是適用于數據量不大的情況下&#xff0c;如果數據量大&#xff0c;…

html上傳文件_.NET基于WebUploader大文件分片上傳、斷網續傳、秒傳

(給DotNet加星標&#xff0c;提升.Net技能)轉自&#xff1a;學習中的苦與樂cnblogs.com/xiongze520/p/10412693.html現在的項目開發基本上都用到了上傳文件功能&#xff0c;或圖片&#xff0c;或文檔&#xff0c;或視頻。我們常用的常規上傳已經能夠滿足當前要求了&#xff0c;…

Hadoop運行任務時一直卡在: INFO mapreduce.Job: Running job

原文鏈接&#xff1a;http://blog.csdn.net/dai451954706/article/details/50464036 ----------------------------------------------------------------------------------------------------- 今天&#xff0c;一大清早同事就讓我幫他解決Hive的問題&#xff1a;他在Hive中…

git切換用戶密碼_Git 最基本的命令

本人比較懶&#xff0c;不是很愛學習新東西&#xff0c;之前用Git一直在用GUI SourceTree&#xff0c;今天因為用到Cloud IDEGitHub才迫不得已用一下Git的命令行&#xff0c;如果你是Git的新手&#xff0c;也分享給你最基本的命令。新建一個Git版本庫把一個本地文件夾變成一個G…

動態分區裝載數據

不開啟 一個個分區導入&#xff0c;分區需要做到一對一。 hive (zmgdb)> insert overwrite table p_t3 partition (cityningbo) > select name,post,address from p_t1 where cityningbo; 會啟動mapreduce進行導入&#xff0c;mr卡在kill job_xxxx&#…

python爬蟲常見報錯_對Python爬蟲常見工具總結,歡迎補充

前言 以前寫爬蟲都是用requests包&#xff0c;雖然很好用&#xff0c;不過還是要封裝一些header啊什么的&#xff0c;也沒有用過無頭瀏覽器&#xff0c;今天偶然接觸了一下。 原因是在處理一個錯誤的時候&#xff0c;用到了幾個以前沒有用過的工具&#xff1b;這幾個工具也挺常…

AI造福設計師:搭配色板這種苦差事交給GAN就好啦(教程)

本文來自AI新媒體量子位&#xff08;QbitAI&#xff09;設計師要開工&#xff0c;總是離不開配色方案&#xff0c;也就是色板。 不過&#xff0c;做色板可不是個簡單的活&#xff0c;色板生成器Colormind的作者Jack Qiao&#xff08;名字來自Product Hunt&#xff0c;我們下面叫…

mapreduce yarn內存參數

1、yarn-site.xml 設置 1.1 RM設置 RM的內存資源配置&#xff0c;主要是通過下面的兩個參數進行的&#xff08;這兩個值是Yarn平臺特性&#xff0c;應在yarn-sit.xml中配置好&#xff09;&#xff1a; yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocati…