Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> RecyclerView 最佳入門

RecyclerView 最佳入門

編輯:關於Android編程

1 在安卓中的列表(List)和網格(Grid)

1.1 在安卓中使用列表和網格

在手機應用中,以列表或者網格的形式展示元素是一個非常重要的模式。用戶可以看到條目(item)的集合並且可以滾動他們。這個條目的集合可以是一個列表、一個網格或者是代表數據的其他的結構。就像如下的圖片:

這裡寫圖片描述

用戶通過觸摸時間或者是工具欄和這些條目的集合進行交互。每一個條目都可以被選中。選中這個條目可能會顯示詳情或者是更新工具欄。如下圖:
這裡寫圖片描述

1.2 使用ReclclerView

RecyclerView類就是用來支持顯示數據集合的。

這是一個有安卓系統提供的,現在化的ListView和GridView版本。RecyclewView處理了之前空間所存在的問題。它強制了一種編碼風格可以讓結果有一種好的表現形式。並且它為增加或者刪除元素提供了默認的動畫。
RecyclerView 允許不同的布局去顯示不同的條目。

ReclclerView使用ViewHolder去存儲view的引用。 一個ViewHolder類是一個adapter裡的靜態內部類,維持了不同view的引用。使用這些引用可以省去findViewById()所花費的時間。

1.3 Adapter

一個Adapter負責管理數據模型,並且把它適配到個子的實體。它集成自RecyclerView.Adapter,並且通過RecyclerView.setAdapter方法分配到指定的recycler view。適配器的輸入可以是任意的java類,但必須通過getItemCount()返回條目的個數。

適配器為不用的元素填充布局。在onCreateViewHolder 這個方法之後這項活就完成了。每當有一個實體在RecyclerView中可見,這個函數就返回一個ViewHolder 對象。

這個實例被用作訪問在被填充的布局中的視圖。onCreateViewHolder 方法只有在新的視圖必須被創建的時候才會調用。

每一個可見狀態的實體都會通過適配器被填入正確的數據模型。一旦數據條目變得課件,適配器就會為剛剛填充的控件指派何時的數據。這項工作由onBindViewHolder 方法完成。

舉個例子,一個列表的實體有可能是這樣的:嘴邊有一個圖片,中間由兩個文字。比如這樣:
這裡寫圖片描述

布局文件<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> android:contentDescription="TODO" android:src="@drawable/ic_launcher" />

1.4 Gradle 依賴

RecyclerView是單獨的控件,在API7+中可以使用,在Gradle中加入依賴

dependencies {
    ...
    compile "com.android.support:recyclerview-v7:23.0.1"
}

1.5 默認的布局管理者

layout manager 決定了數據在RecyclerView中如何戰術。RecyclerView庫提供了如下的manager;

LinearLayoutManager 展示了水平或者垂直的滾動列表 GridLayoutManager 在網格中展示條目 StaggeredGridLayoutManager 在挫列的網格中展示條目

1.6 相關聯的類

Adapter(必須) 提供數據:為各自的實體創建視圖 ViewHolder(必須 )維持了所有被數據填充的實體的視圖的引用 LayoutManager(必須,但默認的實現就可以):同ViewHolder ItemDecoration(默認行為,可以重寫):一個實體的周圍的裝飾 ItemAnimator(默認行為可以重寫):條目增加刪除重新排序所產生動畫

1.7 處理點擊事件

觸摸事件,比如說點擊,應該在recycler view中被view處理。如果觸發了其他對象(比如說activity或者fragment),你應該通過adapter的構造方法傳遞進來,這樣允許adapter存儲對象的引用,然後調用它的方法(回調函數)

1.8 使用不同的布局

adapter需要為每一行條目創建布局,根布局一般是ViewGroup (layout manager),包含了很多view,比如說ImageView 或者TextView,下圖是奇偶行顯示不同的效果

這裡寫圖片描述

getItemViewType 方法可以讓 recycler view 去決定哪一種應該被對象使用。如果這個類型需要的話,框架會子的自動調用onCreateViewHolder 。在 onCreateViewHolder 方法中,你應該填充正確的布局並且返回一個合適的view holder。

1.9 動畫

想要自定義動畫需要繼承RecyclerView.ItemAnimator並且調用RecyclerView.setItemAnimator() 方法,

1.10 過濾和排序

需要在adapter中處理邏輯。

1.11 更新數據

notifyItemInserted(position)在增加一條數據的時候可以通知view去把它加入到何時的位置。

notifyItemRemoved(position)在刪除的時候可以通知,

2 練習:一個簡單的例子

最終目標
這裡寫圖片描述

布局文件



    

    

    

提示:ImageView有android:elevation屬性,會讓安卓畫一個陰影,

沒一個條目的布局文件



    

    

    

創建如下的類

package com.vogella.android.recyclerview;

import java.util.ArrayList;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyAdapter extends RecyclerView.Adapter {
        private ArrayList mDataset;

        // Provide a reference to the views for each data item
        // Complex data items may need more than one view per item, and
        // you provide access to all the views for a data item in a view holder
        public class ViewHolder extends RecyclerView.ViewHolder {
                // each data item is just a string in this case
                public TextView txtHeader;
                public TextView txtFooter;

                public ViewHolder(View v) {
                        super(v);
                        txtHeader = (TextView) v.findViewById(R.id.firstLine);
                        txtFooter = (TextView) v.findViewById(R.id.secondLine);
                }
        }

        public void add(int position, String item) {
                mDataset.add(position, item);
                notifyItemInserted(position);
        }

        public void remove(String item) {
                int position = mDataset.indexOf(item);
                mDataset.remove(position);
                notifyItemRemoved(position);
        }

        // Provide a suitable constructor (depends on the kind of dataset)
        public MyAdapter(ArrayList myDataset) {
                mDataset = myDataset;
        }

        // Create new views (invoked by the layout manager)
        @Override
        public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                        int viewType) {
                // create a new view
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.rowlayout, parent, false);
                // set the view's size, margins, paddings and layout parameters
                ViewHolder vh = new ViewHolder(v);
                return vh;
        }

        // Replace the contents of a view (invoked by the layout manager)
        @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
                // - get element from your dataset at this position
                // - replace the contents of the view with that element
                final String name = mDataset.get(position);
                holder.txtHeader.setText(mDataset.get(position));
                holder.txtHeader.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                                remove(name);
                        }
                    });

                holder.txtFooter.setText("Footer: " + mDataset.get(position));

        }

        // Return the size of your dataset (invoked by the layout manager)
        @Override
        public int getItemCount() {
                return mDataset.size();
        }

}

Activity

public class MyActivity extends Activity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

        // use this setting to improve performance if you know that changes
        // in content do not change the layout size of the RecyclerView
        mRecyclerView.setHasFixedSize(true);

        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);

        // specify an adapter (see also next example)
        mAdapter = new MyAdapter(myDataset);
        mRecyclerView.setAdapter(mAdapter);
    }
    ...
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved