1. 程式人生 > >安卓開發:RecyclerView的使用(一)

安卓開發:RecyclerView的使用(一)

“走路要牽著我呀 小時候老師沒有跟你說過貴重物品要隨身攜帶嗎”


檢視文章:

  1. 安卓開發:RecyclerView的使用(一)
  2. 安卓開發:RecyclerView的使用(二)
  3. 安卓開發:RecyclerView的使用(三)

RecyclerView 的基本用法

開啟 app/build.gradle 檔案,在 dependencies 閉包中新增如下內容:

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

新增完之後記得要點選一下 Sync Now 來進行同步。然後修改 activity_main.xml 中的程式碼, 如下所示:

<LinearLayout 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/recycler_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
</LinearLayout>

新建Fruit 類和 fruit_item.xml,程式碼如下所示:

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。

然後需要指定一個我們自定義的佈局,在layout目錄下新建fruit_item.xml, 程式碼如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
     <ImageView
         android:id="@+id/fruit_image"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
     <TextView
         android: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 中定義的一個內部類,程式碼如下所示:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.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 FruitAdapter(List<Fruit> fruitList) {
         mFruitList = fruitList;
     }
     @Override
     public 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());
     }
     @Override
     public int getItemCount() {
         return mFruitList.size();
     }
} 

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

接著往下看,FruitAdapter 中也有一個建構函式,這個方法用於把要展示的資料來源傳進來, 並賦值給一個全域性變數 mFruitList,我們後續的操作都將在這個資料來源的基礎上進行。

繼續往下看,由於 FruitAdapter 是繼承自 RecyclerView.Adapter 的,那麼就必須重寫 onCreateViewHolder()、onBindViewHolder()和 getItemCount()這 3 個方法。onCreateViewHolder()方法是用於建立 ViewHolder 例項的,我們在這個方法中將 fruit_item 佈局載入 進來,然後建立一個 ViewHolder 例項,並把加載出來的佈局傳入到建構函式當中,最後將 ViewHolder 的例項返回。onBindViewHolder()方法是用於對 RecyclerView 子項的資料進行賦值 的,會在每個子項被滾動到螢幕內的時候執行,這裡我們通過 position 引數得到當前項的 Fruit 例項,然後再將資料設定到 ViewHolder 的 ImageView 和 TextView 當中即可。getItemCount() 方法就非常簡單了,它用於告訴 RecyclerView 一共有多少子項,直接返回資料來源的長度就可以了。

介面卡準備好了之後,我們就可以開始使用 RecyclerView 了,修改 MainActivity 中的程式碼, 如下所示:

public class MainActivity extends AppCompatActivity {
     private List<Fruit> fruitList = new ArrayList<>();
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         initFruits(); // 初始化水果資料
         RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
         recyclerView.setLayoutManager(layoutManager);
         FruitAdapter adapter = new FruitAdapter(fruitList);
         recyclerView.setAdapter(adapter);
     }
     private void initFruits() {
         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 是線性佈局的意思,可以實現和 ListView 類似的效果。 接下來我們建立了 FruitAdapter 的例項,並將水果資料傳入到 FruitAdapter 的建構函式中, 最後呼叫 RecyclerView 的 setAdapter()方法來完成介面卡設定,這樣 RecyclerView 和資料之間 的關聯就建立完成了。

轉載宣告:此篇文章轉載自郭霖作者寫的《第一行程式碼》書中的章節,因為此章節對我幫助很大,並且寫的非常詳細,以便之後方便查閱。特在此做轉載宣告。