http://developer.android.com/training/material/lists-cards.html
可以使用RecycleView或者CardView在app中創建複雜的且具有material design風格的lists或者是cards。
使用RecycleView創建Lists
介紹
RecycleView是ListView的升級版,更爲靈活,且效率給高。同時爲item項提供了一些動畫效果,如加入、移除等,並且可自定義。使用:
使用RecycleView必須爲其指定一個適配器(繼承自RecycleView.Adapter)和layout manager,如果需要,還可以爲item的變化設置合適的動畫效果。
layout manager 處理items視圖的回收和複用,RecycleView提供了三種layout manager,分別爲:
1>.LinearLayoutManager: 設置List爲橫向
(mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);或縱向(vertical )滾動
2>.GridLayoutManager: item爲網格狀排列(類似GridView效果)
3>.StaggeredGridLayoutManager : item爲不規則網格狀排列
(如果需要自定義layout manager可通過繼承RecycleView.LayoutManager)- 動畫
RecycleView已經提供有添加、移除等item動畫效果,如果需要自定義可以繼承RecycleView.ItemAnimator類進行處理,並調用RecycleView.setItemAnimator()進行設置。 - 示例
1>. 在gradle中添加依賴
dependencies {
...
compile 'com.android.support:recyclerview-v7:21.0.+'
}
2>.在佈局中添加RecycleView(和普通控件的用法基本一致):
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
3>.在代碼中關聯RecycleView ,併爲其設置layout manager和適配器
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager; private String[] myDataset = new String[]{"1","2","3","4","5","......."};// 列表中顯示的數據
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// 當確定List內容(數據)的變化不會影響RecycleView佈局的大小時,以下設置可以提高性能
mRecyclerView.setHasFixedSize(true);
// 使用linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// 設置設配器 (MyAdapter見步驟4)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
...
}
4>.適配器(MyAdapter)代碼
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
//自定義的ViewHolder,持有Item中的所有View
public static class ViewHolder extends RecyclerView.ViewHolder {
// 當前item佈局中僅有的一個TextView
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = (TextView)v.findViewById(R.id.my_text_view);
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// 創建一個新的 views (被layout manager回調)
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// 關聯item佈局,item.xml見步驟5
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false);
// 創建並放回一個ViewHolder對象
ViewHolder vh = new ViewHolder(v);
return vh;
}
// 在這方法中對item中的數據(View)進行修改(被layout manager回調)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// 對holder(即對應item)的TextView進行修改
holder.mTextView.setText(mDataset[position]);
}
// 返回數據(dataset)的大小 (被layout manager回調) @Override
public int getItemCount() {
return mDataset.length;
}
}
5>.item.xml(當前示例的item僅爲一個TextView)
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns: android="http://schemas.android.com/apk/res/android"
android :id="@+id/my_text_view"
android :layout_width="match_parent"
android :layout_height="48dp"
>
</TextView>
經過以上5個步驟,一個簡單的由RecycleView創建的List即已經完成。
使用CardView 創建 Cards(卡片效果)
- 介紹:
CardView繼承自FrameLayout,其創建的卡片(Cards)可以具有陰影和圓角效果。
陰影效果:可以通過card_view:cardElevation屬性設置(如果需要在低版本(5.0以下)中使用陰影效果,需要使用兼容包v7 appcompat library。詳情: Maintaining Compatibility.)
圓角效果:可以通過card_view:cardCornerRadius屬性設置(在代碼中可以通過CardView.setRadius方法進行設置)
背景顏色:可以通過card_view:cardBackgroundColor屬性設置 - 示例
1>. 在gradle中添加依賴
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
}
2>.在佈局中添加CardView(這裏需要注意的就是card_view這個屬性域的使用):
<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"
... >
<!-- “卡片”中僅包含一個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>
經過以上2個步驟,一個簡單的由CardView創建的Cards(卡片)即已經完成。