Android L 开发人员预览支持库提供两个新的Widgets,RecyclerView和CardView。html
使用这两个Widgets可以显示复杂的Listview和卡片布局。这两个Widgets默认使用Material design。java
RecyclerView是一个更高级柔性版本号的Listview。RecyclerView是一个能包括很是多视图的容器。它能完美的处理循环和滚动。在item动态变化的Listview使用RecyclerView。android
RecyclerView使用很是easy。因为它提供了:
ide
一、定位item的布局管理器布局
二、常见的item操做默认动画动画
你可以灵活的为RecyclerView本身定义布局管理器和动画。ui
使用RecyclerView。必须使用指定一个adapter、定义一个布局管理器。建立adapter必须继承自RecyclerView.Adapter。实施的细节需要看数据类型和需要的视图。this
RecyclerView widgetspa
RecyclerView 提供了 LayoutManager。RecylerView 不负责子 View 的布局,咱们可以本身定义 LayoutManager 来实现不一样的布局效果,眼下仅仅提供了LinearLayoutManager。.net
LinearLayoutManager 可以指定方向。默认是垂直, 可以指定水平, 这样就轻松实现了水平的 ListView。
RecyclerView Demo:
一、布局文件
<!-- 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"/>
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); // improve performance if you know that changes in content // do not change the 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); } ... } To create a simple adapter: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private String[] mDataset; // Provide a reference to the type of views that you are using // (custom viewholder) public static class ViewHolder extends RecyclerView.ViewHolder { 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, null); // 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; } }
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private String[] mDataset; // Provide a reference to the type of views that you are using // (custom viewholder) public static class ViewHolder extends RecyclerView.ViewHolder { 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, null); // 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; } }
CardView继承自FrameLayout类,可以在一个卡片布局中一致性的显示内容。卡片可以包括圆角和阴影。
可以使用android:elevation属性,建立一个阴影的卡片。
如何指定CardView的属性:
一、使用android:cardCornerRadius属性指定圆角半径
二、使用CardView.setRadius 设置圆角半径。
三、使用 android:cardBackgroundColor属性设置卡片颜色
在建立布局文件里建立CardView:
<!-- 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>
參考:
http://developer.android.com/preview/material/ui-widgets.html