如果要在您的應用中使用材料設計風格創建複雜列表與卡片,您可使用 RecyclerView 以及 CardView 小組件。
創建列表
RecyclerView 小組件比 ListView 更高級且更具靈活性。 此小組件是一個用於顯示龐大數據集的容器,可通過保持有限數量的視圖進行非常有效的滾動操作。 如果您有數據集合,其中的元素將因用戶操作或網絡事件而發生改變,請使用 RecyclerView 小組件。
RecyclerView 類別將通過提供下列功能簡化龐大數據集的顯示與處理:
- 用於項目定位的佈局管理器
- 用於通用項目操作(例如刪除或添加項目)的默認動畫
您也可靈活選擇如何爲 RecyclerView 小組件定義定製佈局管理器與動畫。
圖 1.RecyclerView 小組件。
如果要使用 RecyclerView 小組件,您必須指定一個適配器和一個佈局管理器。 如果要創建一個適配器,請擴展 RecyclerView.Adapter 類別。實現的詳情將取決於數據集的具體信息以及視圖的類型。 如果要了解更多信息,請參閱下列示例。
佈局管理器將確定 RecyclerView 內各項目視圖的位置並決定何時重新使用用戶已不可見的項目視圖。 如果要重新使用(或重複使用)一個視圖,佈局管理器可能會要求適配器以數據集中的另一個元素替換視圖的內容。 以此方式重複使用視圖將可避免創建不必要的視圖或執行成本高昂的 findViewById() 查找,從而改善性能。
RecyclerView 提供這些內置佈局管理器:
- LinearLayoutManager 以垂直或水平滾動列表方式顯示項目。
- GridLayoutManager 在網格中顯示項目。
- StaggeredGridLayoutManager 在分散對齊網格中顯示項目。
如果要創建一個定製佈局管理器,請擴展 RecyclerView.LayoutManager 類別。
動畫
RecyclerView 在默認情況下啓用增添與刪除項目的動畫。如果要定製這些動畫,請擴展RecyclerView.ItemAnimator 類別
並且使用RecyclerView.setItemAnimator() 。
示例
圖 2 - 隨附 RecyclerView 的列表。
下列代碼示例將展示如何將 RecyclerView 添加至佈局:
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
將 RecyclerView 小組件添加至您的佈局後,立即獲取對象圖柄並將其連接至佈局管理器,同時附加一個適配器以便顯示數據:
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);
}
...
}
適配器可讓您存取數據集中的項目,爲項目創建視圖,並且在原始項目不再可見時以新數據項目替換視圖的某些內容。 下列代碼示例將展示一個簡單的實現,目標爲一個包含使用 TextView 小組件顯示的字符串陣列的數據集:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] 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 static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] 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.my_text_view, 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
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return mDataset.length;
}
}
創建卡片
圖 3.卡片示例。
CardView 擴展 FrameLayout 類別並讓您能夠顯示卡片內的信息,這些信息在整個平臺中擁有一致的呈現方式。CardView 小組件可擁有陰影和圓角。
如果要使用陰影創建卡片,請使用 card_view:cardElevation 屬性。CardView 在 Android 5.0(API 級別 21)及更高版本中使用真實高度與動態陰影,而在早期的 Android 版本中則返回編程陰影實現。如需瞭解詳細信息,請參閱保持兼容性
使用這些屬性定製 CardView 小組件的外觀:
- 如果要在您的佈局中設置圓角半徑,請使用 card_view:cardCornerRadius 屬性。
- 如果要在您的代碼中設置圓角半徑,請使用 CardView.setRadius 方法。
- 如果要設置卡片的背景顏色,請使用 card_view:cardBackgroundColor 屬性。
下列代碼示例將展示如何將 CardView 小組件包括在您的佈局中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
... >
<!-- A CardView that contains a TextView -->
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="200dp"
android:layout_height="200dp"
card_view:cardCornerRadius="4dp">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v7.widget.CardView>
</LinearLayout>
如果要了解更多信息,請參閱 CardView 的 API 參考。
添加依賴項
RecyclerView 與 CardView 小組件爲 v7 支持內容庫的一部分。 如果要在您的項目中使用這些小組件,請將這些 Gradle 依賴項添加至您的應用模塊:
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'
}
參考地址安卓官網。