Android 第十八課 強大的滾動控件 RecyclerView

步驟:

一、添加依賴庫

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

二、在activity_mian.xml中,添加RecyclerView控件,并占據整個頁面。

三、把你要在RecyclerView中展示的內容,設置成一個實體類Fruit,接著為RecyclerView的子項(展示的各個內容)制定一個我們自定義的布局fruit_item.xml(用來放在RecyclerView里面)。

四、新建適配器(FruitAdapter)

------------------------------------------------------------------------------------------》

Android 提供了一個更強大的滾動控件--RecyclerView。它是一個增強版的ListView。

新建RecyclerView項目。自動創建好項目,開始。

1、RecyclerView的基本用法

百分比布局類似,RecyclerView也屬于新增控件,為了讓RecyclerView在所有Android版本上使用,Android團隊使用了同樣

的方式,將RecyclerView定義在了support庫中,因此,要想使用RecyclerView這個控件,首先在項目的build.gradle中添加對應的依賴庫才行,代開app/gradle文件,在dependencies中添加如下內容:

dependencies {?

?implementation fileTree(dir: 'libs', include: ['*.jar'])?

?implementation 'com.android.support:appcompat-v7:26.1.0'

?????.....

? compile'com.android.support:recyclerview-v7:26.1.0'

}

然后修改activity_main.xml中的代碼,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.recyclerviewtestb.MainActivity"> <android.support.v7.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

在布局中添加RecyclerView控件也是非常簡單的,先為RecyclerView指定一個id。讓RecyclerView占據整個布局的空間,由于RecyclerVeiw不是內置在系統SDK當中的,所以需要把完整的報名路徑寫出來。

我們先準備好一份同樣的水果圖片。放在drawable目錄下,然后創建一個實體類Fruit,作為RecyclerView的適配類型,代碼如下:

package com.example.recyclerviewtestb;/*** Created by ZHJ on 2018/3/10.*/
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 int getImageId() {return imageId;}}

Fruit類中只有兩個字段,name表示水果的名稱,imageId表示水果對那個圖片的資源id。

然后我們需要為RecyclerView的子項制定一個我們自定義的布局,在layout目錄下新建fruit_item.xml。

代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp" /></LinearLayout>
在這里我們可以設置展示的樣式。這里就簡單設置一下。


四、

接下來,為RecyclerView準備一個適配器,新建FruitAdapter類,讓這個適配器繼承自RecyclerView.Adapter,并將泛型指定為FruitAdapter.ViewHolder。其中,ViewHolder是我們在FruitAdapter中定義的一個內部類,代碼如下:

package com.example.recyclerviewtestb;import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.TextView;import java.util.List;/*** Created by ZHJ on 2018/3/10.*/public class FruitAdpater extends RecyclerView.Adapter<FruitAdpater.ViewHolder> {private List<Fruit> mFruitList;static class ViewHolder extends  RecyclerView.ViewHolder{//內部類ImageView fruitImage;TextView fruitName;public ViewHolder(View view){super(view);fruitImage= (ImageView)view.findViewById(R.id.fruit_image);fruitName = (TextView)view.findViewById(R.id.fruit_name);}}//構造函數public  FruitAdpater(List<Fruit>fruitList){mFruitList = fruitList;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);ViewHolder holder = new ViewHolder(view);return holder;}
@Override public void onBindViewHolder(ViewHolder holder, int position) {Fruit fruit = mFruitList.get(position);holder.fruitImage.setImageResource(fruit.getImageId());holder.fruitName.setText(fruit.getName());}@Overridepublic int getItemCount() {return mFruitList.size();}
}

我們先定義了一個內部類ViewHolder,ViewHolder要繼承自RecyclerView.ViewHolder。然后,ViewHolder的構造函數中要傳入一個View參數,這個參數通常就是RecyclerView子項的最外層布局,那么我們就可以通過findViewById()方法來獲取到布局中的ImageView和TextView的實例了。

????接著往下看,FruitApapter中也有一個構造函數,這個方法用于把要展示的數據源傳進來,并賦值給一個全局變量mFruitList,我們后續的操作都將在這個數據源的基礎上進行。

?????繼續往下看,由于FruitAdapter是繼承自RecyclerView.Adapter的,那么就必須重寫onCreateViewHolder(),onBindViewHolder()和getItemCount()這3個方法。

onCreateViewHolder()方法用于創建ViewHolder實例的,我們在這個方法中將fruit_item布局加載進來,然后創建一個ViewHolder實例,并把加載進來,然后創建一個ViewHolder實例,并把加載出來的布局傳入到構造函數中,最后將ViewHolder()方法的實例返回。

onBindViewHolder()方法是用于對RecyclerView子項的數據進行賦值,會在每個子項被滾到屏幕內的時候執行,這里我們通過position參數得到當前項的Fruit實例,然后再將數據設置到ViewHolder的ImageView和TextView當中即可。

getItemCount()方法就簡單了,它用于告訴RecyclerView一共有多少子項,直接返回數據源的長度九課就可以了。


五、

適配器準備好了之后,我們開始修改MainActivity中的代碼,如下:


package com.example.recyclerviewtestb;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruit();//初始化水果數據RecyclerView recyclerView =(RecyclerView)findViewById(R.id.recycler_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);recyclerView.setLayoutManager(layoutManager);FruitAdpater adpater = new FruitAdpater(fruitList);recyclerView.setAdapter(adpater);}private  void  initFruit(){ for (int i = 0; i < 2; i++) {Fruit apple = new Fruit("Apple", R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit("Banana", R.drawable.banana_pic);fruitList.add(banana);Fruit orange = new Fruit("Orange", R.drawable.orange_pic);fruitList.add(orange);Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);fruitList.add(watermelon);Fruit pear = new Fruit("Pear", R.drawable.pear_pic);fruitList.add(pear);Fruit grape = new Fruit("Grape", R.drawable.grape_pic);fruitList.add(grape);Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);fruitList.add(cherry);Fruit mango = new Fruit("Mango", R.drawable.mango_pic);fruitList.add(mango);}
}
}

這里使用了一個同樣的initFruits()方法,用于初始化所有的水果數據。

接著在onCreate()方法中我們先獲取RecyclerView的實例,然后創建一個LinearLayoutManager對象,并將它設置到RecyclerView中。LayoutManager用于指定RecyclerView的布局方式,這里使用的LinearLayoutManager是線性布局的意思。

接下來,我們創建了FruitAdaptper的實例,并將水果數據傳入FruitAdapter的構造函數中,最后調用RecyclerView的setAdaper()方法來完成適配器設置,這樣RecyclerView和數據之間的關聯就建立完成了。


可以運行一下:



----------------------------------------------------------------》

實現橫向滾動和瀑布流布局:

接下來,我們開始嘗試實現橫向滾動的效果,

首先,要對fruit_item.xml布局進行修改,因為這個布局里面的元素是水平排列的,適用于縱向滾動

如果我們要實現橫向滾動,應該把fruit_item里的元素該成垂直排列。

修改fruit_item.xml中的代碼,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="100dp"android:layout_height="match_parent"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content"  android:layout_gravity="center_horizontal"/><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="10dp"/></LinearLayout>

我們將Linearlayout改成垂直排列,并把寬度設為100dp。這里將寬度指定為固定值是因為每種水果的文字長度不一致。

修改MainActivity中的代碼,如下所示:

package com.example.recyclerviewtestb;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruit();//初始化水果數據RecyclerView recyclerView =(RecyclerView)findViewById(R.id.recycler_view);LinearLayoutManager layoutManager = new LinearLayoutManager(this);  layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(layoutManager);FruitAdpater adpater = new FruitAdpater(fruitList);recyclerView.setAdapter(adpater);}......
}

我們只是調用了LinearLayoutManager的setOrientation()方法來設置布局的排列方向,默認是縱向排列的,我們傳入LinearLayoutManager.HORIZONTAL表示讓布局橫行排列,這樣RecyclerView就可以橫向滾動了。

運行一下:

RecyclerView的布局排列是由LayoutManager去管理,LayoutManager中指定了一套可擴展的布局排列接口,子類只要按照接口的規范來實現,就可以指定出各種不同排列方式的布局。


除了LinearLayoutManager之外,RecyclerView還給我們提供了GridLayoutManager和StaggeredGridLayoutManager這兩種內置的布局排列方式。

GridLayoutManager可以用來實現網格布局。

StaggeredGridLayoutManager可以用來實現瀑布流布局。

《待續。。。。》

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

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

相關文章

通過rtcwake命令設置系統S3(休眠到內存)/S4(掛起到硬盤)一段時間后自動喚醒

rtcwake -m disk -s 60 //S4&#xff08;掛起&#xff09;60秒后自動喚醒 rtcwake -m mem -s 60 //S3(休眠&#xff09;60秒后自動喚醒

電商首頁設計的時候,就應該考慮這個

如果有目的去找某一類商品的人幾乎都會從導航或搜索進去了&#xff0c;看首頁的一般是屬于那些還沒想好要買什么東西的人&#xff0c;這些人一般都是漫無目的的瞎逛&#xff0c;看在首頁有沒有特價的或便宜的東西被撿到。 轉載于:https://www.cnblogs.com/wangzong/p/3256555.h…

JavaScript 第一課 JavaScript簡史

1、JavaScript的起源 Java在理論上可以部署在任何環境下&#xff0c;但是JavaScript卻更傾向于只應用在Web瀏覽器。JavaScript是一種腳本語言&#xff0c;通常只能通過Web瀏覽器去完成一些操作而不能像普通意義上的程序那樣獨立運行。因為需要Web瀏覽器進行解釋和執行&#xff…

Linux下的屏保設置 xset s 與 xset dpms

Linux下的屏保設置 xset s 與 xset dpmshttp://bbs.chinaunix.net/archiver/?tid-2112889.html用xset q 可以查看當前屏保的設置情況&#xff0c;黑屏方式的屏保有兩種狀態&#xff1a;1. xset 的s參數后面可接兩個數字參數&#xff0c;前一個即是進入屏保的秒數&#xff0…

ios即時通訊客戶端開發之-mac上安裝MySQL

一、安裝 到MySQL官網上http://dev.mysql.com/downloads/mysql/&#xff0c;下載mysql可安裝dmg版本 比如&#xff1a;Mac OS X ver. 10.7 (x86, 64-bit), DMG Archive 下載完的文件為&#xff1a;mysql-5.6.10-osx10.7-x86_64.dmg 1.點擊&#xff0c;安裝包里的 2.點擊安裝 安…

Android 第十九課 大喇叭--廣播機制----動態注冊監聽網絡變化與靜態注冊實現開機啟動

為了便于進行 系統級別的消息通知&#xff0c;Android引入了一套廣播消息機制。 1、廣播機制簡介&#xff1a;因為Android中的每個應用程序都可以對自己感興趣的廣播盡心注冊&#xff0c;這樣程序只會接收自己所關心的廣播內容&#xff0c;這些廣播來自于系統的&#xff0c;也可…

dbus 和 policykit 實例篇(python)

dbus 和 policykit 實例篇&#xff08;python&#xff09; 使用policykit 的程序一般都有一個dbus daemon程序來完成相關操作&#xff0c;這個dbus daemon 會在系統注冊一個system bus 服務名&#xff0c;用于響應要求root privileged的操作&#xff0c;當dbus請求到達時會先驗…

一個實際的sonar代碼檢查的配置文件

國內私募機構九鼎控股打造APP&#xff0c;來就送 20元現金領取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html內部邀請碼&#xff1a;C8E245J &#xff08;不寫邀請碼&#xff0c;沒有現金送&#xff09;國內私募機構九鼎控股打造&#xff0c;九鼎投資是在全國股份…

JavaScript 第二課 JavaScript語法

本章內容&#xff1a;語句變量和數組操作符條件語句和循環語句函數與對象 ------------------------------------------------------------- 準備&#xff1a; 編寫JavaScript腳本只需要一個普通地文本編輯器和一個Web瀏覽器就足啦。 用JavaScript編寫的代碼必須通過HTML/XHTML…

和菜鳥一起學linux之DBUS基礎學習記錄

轉自&#xff1a;http://blog.csdn.net/eastmoon502136/article/details/10044993 D-Bus三層架構 D-Bus是一個為應用程序間通信的消息總線系統, 用于進程之間的通信。它是個3層架構的IPC 系統&#xff0c;包括&#xff1a; 1、函數庫libdbus &#xff0c;用于兩個應用程序互…

Android 第二十課 廣播機制(大喇叭)----發送自定義廣播(包括發送標準廣播和發送有序廣播)

廣播分為兩種類型&#xff1a;標準廣播和有序廣播 我們來看一下具體這兩者的具體區別&#xff1a; 1、發送標準廣播 我們需要先定義一個廣播接收器來準備接收此廣播才行&#xff0c;否則也是白發。 新建一個MyBroadcastReceiver,代碼如下&#xff1a; package com.example.broa…

八大排序算法

概述 排序有內部排序和外部排序&#xff0c;內部排序是數據記錄在內存中進行排序&#xff0c;而外部排序是因排序的數據很大&#xff0c;一次不能容納全部的排序記錄&#xff0c;在排序過程中需要訪問外存。 我們這里說說八大排序就是內部排序。 當n較大&#xff0c;則應采用…

需求?

1 需求怎樣描述清楚&#xff1f; 利用用例技術&#xff0c;一般這里指的是系統用例&#xff1b;包括以下幾個內容&#xff1a; 用例視圖 系統的功能描述&#xff1b; 用例規約 規定了用戶和系統的交互過程&#xff1b;用戶如何使用系統&#xff1b;用戶如何交互&#xff0c;以及…

Android 第二十一課 RecyclerView簡單的應用之編寫“精美”的聊天頁面

1、由于我們會使用到RecyclerView&#xff0c;因此首先需要在app/build.gradle當中添加依賴庫。如下&#xff1a; apply plugin: com.android.application .... dependencies {....compile com.android.support:recyclerview-v7:26.1.0 } 2、然后開始編寫主頁面&#xff0c;修該…

VS 2008 生成操作中各個選項的差別

近日&#xff0c;在編譯C#項目時經常發現有些時候明明代碼沒錯&#xff0c;但就是編譯不過&#xff0c;只有選擇重新編譯或者清理再編譯才會不出錯&#xff0c;本著求學的態度&#xff0c;搜羅了下VS2008IDE中生成操作的種類以及差別&#xff0c;整理如下&#xff1a;內容(Cont…

dbus-python指南

菜鳥學dbus-python&#xff0c;翻譯dbus-python指南&#xff0c;錯誤之處請在所難免&#xff0c;請諸位不吝賜教&#xff0c;多多指正&#xff01;查看英文原版請點這里。 連接總線Connecting to the Bus方法調用Making method calls代理對象proxy objects接口和方法Interfaces…

JavaScript 第三課 DOM

主要內容&#xff1a; 節點5個常用的DOM方法&#xff1a;getElementById、getElementByTagname、getElementByClassName、getAttribute和setAttribute詳細內容: 1、文檔&#xff1a;DOM中的“D”如果沒有document(文檔),DOM也就無從談起。當創建了一個網頁并把它加載到Web瀏覽器…

源碼編譯安裝Nginx

1.源碼下載 Nginx在github上有一個只讀源碼庫&#xff0c;我獲取的源碼方式為&#xff1a; git clone https://github.com/nginx/nginx.git 2.configure 我下載源碼的時候&#xff0c;github上的源碼的目錄結構為: auto, conf, contrib, docs, misc, src共6個目錄。src目錄是…

SOAP協議初級指南(2)

目前的技術存在的問題&#xff1f;   盡管DCOM和IIOP都是固定的協議&#xff0c;業界還沒有完全轉向其中任何一個協議。沒有融合的部分原因是文化的問題所致。而且在當一些組織試圖標準化一個或另一個協議的時候&#xff0c;兩個協議的技術適用性就被提出質疑。傳統上認為DC…

JavaScript 第四課 案例研究:JavaScript圖片庫

主要內容&#xff1a;編寫一個優秀的標記文件編寫一個JavaScript函數以顯示用戶想要查看的內容由標記出發函數調用使用幾個新方法擴展這個JavaScript函數 學習過DOM&#xff0c;我們用JavaScript和DOM去建立一個圖片庫。最好的辦法是什么呢&#xff1f; 利用JavaScript來建立圖…