RecyclerView控件的基本使用(增强版的ListView)
ListView由于其強大的功能,在過去的Android開發當中可以說是貢獻卓越,直到今天仍然還有不計其數的程序在繼續使用著ListView。不過ListView并不是完全沒有缺點的,比如說如果我們不使用一些技巧來提升它的運行效率,那么ListView的性能就會非常差。還有ListView的拓展性也不夠好,它只能實現數據縱向滾動的效果,如果我們想實現橫向滾動的話,ListView是做不到的。
為此,Android提供了一個更強大的滾動控件RecyclerView。它可以說是一個增強版的ListView,不僅可以輕松實現和ListView同樣的效果,還優化了ListView中存在的各種不足之處。目前Android官方更加推薦使用RecyclerView,未來也會有更多的程序逐漸從ListView轉向RecyclerView,所以,掌握RecyclerView控件的使用方法是很有必要的,下面我們一起來了解下RecyclerView的用法吧。
RecyclerView屬于新增的控件,為了讓RecyclerView可以在Android所有版本中都可以使用,Android團隊將RecyclerView定義在了support庫當中。因此,想要使用RecyclerView這個控件,首先需要在項目的build.gradle中添加相應的依賴庫才行。
打開app/build.gradle文件,在dependencies閉包中添加如下內容:
implementation 'com.android.support:recyclerview-v7:28.0.0'添加完了之后記得要點擊一下Sync Now來進行同步。
activity_main.xml代碼:
<?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"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>布局中代碼很好理解,就引入了一個RecyclerView控件,指定了控件id,控件寬度,控件高度。
這里我們想要使用RecyclerView來實現和ListView相同的效果,因此就需要準備一份同樣的水果圖片。簡單起見,我們就直接將ListView項目中的圖片文件復制過來就可以了,另外Fruit類和fruit_item.xml也可以復制過來。這里我都貼上代碼吧:
Fruit.java代碼:
package com.example.administrator.activitydemo;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_item.xml代碼:
<?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="wrap_content"><ImageViewandroid:id="@+id/iv_name"android:layout_width="40dp"android:layout_height="40dp" /><TextViewandroid:id="@+id/tv_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。從java語法中我們也可以看出,ViewHolder類是我們在FruitAdapter類中定義的一個內部類。
FruitAdapter.java代碼:
package com.example.administrator.activitydemo;import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView;import java.util.List;public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {private List<Fruit> fruitList;public FruitAdapter(List<Fruit> fruitList) {this.fruitList = fruitList;}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fruit_item, viewGroup, false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {Fruit fruit = fruitList.get(i);viewHolder.iv_name.setImageResource(fruit.getImageId());viewHolder.tv_name.setText("" + fruit.getName());}@Overridepublic int getItemCount() {return fruitList.size();}static class ViewHolder extends RecyclerView.ViewHolder {ImageView iv_name;TextView tv_name;public ViewHolder(@NonNull View itemView) {super(itemView);iv_name = (ImageView) itemView.findViewById(R.id.iv_name);tv_name = (TextView) itemView.findViewById(R.id.tv_name);}}}雖然這段代碼看上去好像有點長,但其實它比ListView的適配器更容易理解。這里我們首先定義了一個內部類ViewHolder,ViewHolder要繼承自RecyclerView.ViewHolder。然后ViewHolder的構造函數中要傳入一個View參數,這個參數通常就是RecyclerView子項的最外層布局,那么我們就可以通過findViewById()方法來獲取到布局中的ImageView和TextView的實例了。
接著往下看,FruitAdapter中也有一個構造函數,這個方法用于把要展示的數據源傳進來,并賦值給一個全局變量fruitList,我們后續的操作都將在這個數據源的基礎上進行。
繼續往下看,由于FruitAdapter是繼承自RecyclerView.Adapter的,那么就必須重寫以下3個方法了。
1.onCreateViewHolder(),這個函數是用于創建ViewHolder實例的,從它的返回值類型就可以看出,我們在這個函數中主要將fruit_item.xml布局加載到ViewHolder中,并將創建好的ViewHolder實例返回。
2.onBindViewHolder(),這個函數是用于對RecyclerView子項的數據進行賦值的,會在每個子項被滾動到屏幕內的時候執行,這里我們通過i參數得到當前項的Fruit實例,然后將數據設置到ImageView和TextView中即可。
3getItemCount(),這個函數是用于告訴RecyclerView一共有多少子項,這里直接返回數據源的長度就可以了。
適配器準備好了之后,我們就可以在MainActivity中使用RecyclerView控件了。
MainActivity.java代碼:
package com.example.administrator.activitydemo;import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; 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 RecyclerView recyclerView;private String[] data = {"Apple", "Banana", "Orange", "Watermelon","Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango","Apple", "Banana", "Orange", "Watermelon","Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango"};private int[] res = {R.drawable.apple, R.drawable.banana, R.drawable.orange, R.drawable.watermelon,R.drawable.pear, R.drawable.grape, R.drawable.pineapple, R.drawable.strawberry, R.drawable.cherry, R.drawable.mango,R.drawable.apple, R.drawable.banana, R.drawable.orange, R.drawable.watermelon,R.drawable.pear, R.drawable.grape, R.drawable.pineapple, R.drawable.strawberry, R.drawable.cherry, R.drawable.mango};private List<Fruit> fruitList;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();//初始化UI控件initData();//初始化數據}private void initView() {recyclerView = (RecyclerView) findViewById(R.id.recyclerView);}private void initData() {initFruits();//初始化水果數據LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);recyclerView.setLayoutManager(layoutManager);FruitAdapter adapter = new FruitAdapter(fruitList);recyclerView.setAdapter(adapter);}private void initFruits() {fruitList = new ArrayList<>();for (int i = 0; i < data.length; i++) {Fruit fruit = new Fruit(data[i], res[i]);fruitList.add(fruit);}}}可以看出,MainActivity.java中的代碼與之前差不多,主要修改了initData()方法中以下幾個地方:
1.添加了一個LinearLayoutManager(線性布局管理器)
2.為RecyclerView控件設置了布局管理器,參數傳入上面的LinearLayoutManager(線性布局管理器)
3.實例化一個FruitAdapter適配器
4.為RecycerView設置適配器
效果圖:
可以看出,我們使用RecyclerView實現了和ListView幾乎一模一樣的效果,雖說在代碼方面并沒有明顯地減少,但是邏輯變得更加清晰了,如果你只是初次使用RecyclerView控件,可能暫時還不太能了解它的強大,記得我在初次學習它的時候,也并不能感受到它有多大優勢,只是聽到周遭的吹噓,就嘗試著了解了下這個控件,發現確實比ListView要好用一點,可能這就是知識的魅力吧,在不斷探索中,得以成長,在收獲經驗的同時,增強主觀的判斷。
?
?
總結
以上是生活随笔為你收集整理的RecyclerView控件的基本使用(增强版的ListView)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华电国际是国企吗
- 下一篇: 按什么计算个人所得税