安卓開發之RecyclerView

来源:http://www.cnblogs.com/todaylovegoaway/archive/2016/01/28/5166970.html
-Advertisement-
Play Games

RecyclerView是一個非常好用的控制項,它的效果和ListView很相似,甚至可以說RecyclerView的出現是來取代ListView的 RecyclerView比ListView更加靈活,具有更高的擴展性 下麵就詳細的介紹RecyclerView的用法 既然RecyclerView上來取


RecyclerView是一個非常好用的控制項,它的效果和ListView很相似,甚至可以說RecyclerView的出現是來取代ListView的

RecyclerView比ListView更加靈活,具有更高的擴展性

下麵就詳細的介紹RecyclerView的用法

既然RecyclerView上來取帶ListView的那說明RecyclerView和ListView的用法很相似,事實確實這樣,也就是兩個東西,一個控制項和適配器(Adapter)

一:導包

我這裡開發使用的AndroidStudio,再使用RecyclerView之前要先引入RecyclerView的包(這個是必須的,也是不用解釋的)

在build文件中找到dependencies代碼塊,添加compile 'com.android.support:recyclerview-v7:23.0.0'這句話,重新構建項目就可以使用RecyclerView了

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:recyclerview-v7:23.0.0'
}

二:寫xml文件

做完上面的工作就可以開始寫代碼了,首先創建一個Activity同時生成xml佈局文件,在佈局文件中寫入RecyclerView控制項

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

再寫上面的代碼是RecyclerView的時候不能直接寫RecyclerView,必須加上前面的android.support.v7.widget,如果記不起前面的內容,給你說一種簡便方法,現在Activity中聲明一個變數RecyclerView

 

可以看到聲明瞭RecyclerView之後上面的import就會自動生成,import後面的內容就是RecyclerView的全路徑了。

三:寫適配器類

首先創建一個類繼承自RecyclerView.Adapter

相信在ListView中已經很熟悉ViewHolder這個類了,在RecyclerView的Adapter中ViewHolder內置了,所以先不要管什麼,必須先寫一個ViewHolder內部類繼承自RecyclerView.ViewHolder,重寫構造函數,這個時候先不要急實現Adapter的抽象方法

public class MyRecyclerViewAdapter extends RecyclerView.Adapter {
    
    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

做完上面的再去將我們寫的ViewHolder給Adapter綁上,就是RecyclerView.Adapter後面尖括弧的內容

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

昨晚上面的步驟再去實現Adapter的抽象方法

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        return null;
    }

    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

如果先去實現了上面的抽象方法,不先做上面的步驟你會很麻煩,甚至可能會思維混亂不知所措

這樣這個Adapter類基本成型了,下麵來介紹這些方法的作用

首先onCreateViewHolder()這個方法看名字就知道是用來創建ViewHolder類的,上面雖然寫出了ViewHolder類但是還沒有生成實例,也就是new的過程所以這個方法就是用來new ViewHolder的,看myViewHolder有一個構造方法,構造方法裡面有一個View的對象,所以在這裡創建ViewHolder的時候要傳入一個參數,這裡的這個View很簡單就是你RecyclerView的每一項的View的對象,用LayoutInflater載入,最後返回ViewHolder

其次onBinderViewHolder();這裡面有兩個參數MyViewHolder myViewHolder 你生成的ViewHolder實例, int i 代表目前是哪一行,所以這個方法是來給ViewHolder裡面的控制項賦值的

再看getItemCount();就是確定你這個RecyclerView有多少行

MyViewHolder是初始化每一行空間的地方

將上面的方法都實現就形成了下麵的Adapter類

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private List<String> mList;
    private Context context;
    public MyAdapter(List<String> mList,Context context){
        this.mList = mList;
        this.context = context;
    }
    @Override
    public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
        myViewHolder.tv_msg.setText(mList.get(i));
    }


    @Override
    public int getItemCount() {
        return mList.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv_msg;
        public MyViewHolder(View itemView) {
            super(itemView);
            tv_msg = (TextView) itemView.findViewById(R.id.tv_msg);
        }
    }
}  

四:最後Activity裡面的內容 

在Activity裡面的內容就很簡單了,也就是setAdapter了,值得提提的是除了設置Adapter,在RecyclerView裡面有一個LayoutManager的東西,這也是RecyclerView擴展性高的主要原因

代碼如下

public class MainActivity extends Activity {

    private RecyclerView recyclerView;
    private List<String> mList ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        function();

    }

    private void function() {
        mList = new ArrayList<>();
        for (int i = 0 ; i < 20 ; i++){
            mList.add("Hello"+i);
        }

        MyAdapter adapter = new MyAdapter(mList,this);
        LinearLayoutManager llm = new LinearLayoutManager(this,0,false);
        recyclerView.setLayoutManager(llm);
        recyclerView.setAdapter(adapter);
    }

    private void initView() {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    }

}

解釋一下,首先通過findViewById找到RecyclerView

然後初始化List

然後生成Adapter實例

接下來生成LayoutManager的對象

最後設置LayoutManager和Adapter。

五:最後

解釋一下LayoutManager

RecyclerView的LayoutManager有三種,常用的有兩種,這裡接介紹下常用的兩種

第一種LinearLayoutManager

這個一看就知道線性佈局管理,構造方法有三個參數,第一個上下文對象(不描述),第二個是一個int型的參數(只能是0和1)0代表橫向,1代表縱向,第三個參數Boolean表示順序還是倒序

false代表順序,true代表倒序;這種佈局管理器的效果和ListView的效果是一樣的一行只能放一個item

第二種GridLayoutManager

這個一看就知道是網格佈局管理器,也就是說用這種管理器可在一行放多個item,它有兩個參數;第一個上下文對象化,第二個int型表示一行放的item的個數(1:表示一行放一個item;2:表示一行放2個item)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • css如何實現讓文字沉到元素的底部:在實際應用中可能有這樣的需求,那就是將指定的文本沉降到元素的底部。下麵就通過代碼實例介紹以下如何實現此效果。代碼如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author
  • 1.介面部分:對外聲明類的行為和特征(類的定義分為:介面部分和實現部分) ① @interface 介面關鍵字:用於表示這是一個類的介面部分 介面部分功能:是定義類的靜態特征和聲明動態行為 @end 作為結束標誌 對外介面:通過介面就可以在不知道實現的情況下,瞭解這個類有什麼 Person:類名,每
  • 在web頁面中,有a標簽的超鏈接實現跳轉,同樣在Android當中,用TextView控制項來顯示文字,實現它的事件來跳轉。 核心代碼如下: //以下代碼寫在onCreate()方法當中 textView1=(TextView)findViewById(R.id.sound_help); String
  • Remote Displayer for Android V1.0.
  • 代碼: #import "RootViewController.h" //為判斷手機的型號 -(NSString*)deviceString添加頭文件 #import "sys/utsname.h" @interface RootViewController () @end @implementat
  • 一、問題描述 使用百度地圖實現如圖所示應用,首先自動定位當前我起始位置(小圓點位置),並跟隨移動不斷自動定位我的當前位置 百度Api不同版本使用會有些差異,本例中加入lib如下: 二、編寫MyApplication類 public class MyApplication extends Applic
  • 介紹 最近要使用播放器做一個簡單的視頻播放功能,開始學習VideoView,在橫豎屏切換的時候碰到了點麻煩,不過在查閱資料後總算是解決了。在寫VideoView播放視頻時候定義控制的代碼全寫在Actvity里了,寫完一看我靠代碼好亂,於是就寫了個自定義的播放器控制項,支持指定大小,可以橫豎屏切換,手動
  • 流程梳理 今天開始會寫幾篇關於AFN源碼解讀的一些Blog,首先要梳理一下AFN的整體結構(主要是討論2.x版本的Session訪問模塊): 我們先看看我們最常用的一段代碼: 在前面關於 AFN URLEncode 的文章說道,AFN將網路訪問分為三個過程化的模塊,下麵我把第一部分再分為兩個步驟:
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...