Android L的support library中包含了两个新的组件(RecyclerView和CardView),他们可以用于显示复杂的布局而且都默认采用了Material的风格。
RecyclerView
很多人将它跟ListView对比,说它升级版的ListView,其实它可以做的更多,比如GridView也可以用它来代替,还比如listView中item的样式有多种,也可以通过它来实现,拓展性很强,这里只是简单介绍下它们的使用方法,就以薄荷的收货地址为例,没用RecyclerView的样子如下图:
使用起来很简单
添加依赖
compile 'com.android.support:recyclerview-v7:21.0.3' compile 'com.android.support:cardview-v7:21.0.3'
添加xml文件
<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" />
初始化(跟listview不同)
recycler_view = (RecyclerView) findViewById(id.recycler_view); //设置LinearLayoutManager 可以指定方向,默认是垂直, 可以设置成水平。 mLayoutManager = new LinearLayoutManager(this); //mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); recycler_view.setLayoutManager(mLayoutManager); //设置adapter addressListAdapter = new AddressListAdapter(ctx, mAddressList); recycler_view.setAdapter(addressListAdapter);
这里和listview对比最大的不同就是Adapter了,它必须继承自RecyclerView.Adapter
,源码如下:
public class AddressListAdapter extends RecyclerView.Adapter<AddressListAdapter.ViewHolder> {
static final String TAG = AddressListAdapter.class.getName();
public onAddressUpdateListener addressUpdateListener;
private Context mContext;
private List<Address> mAddresses;
public AddressListAdapter(Context mContext, List<Address> addresses) {
super();
this.mContext = mContext;
this.mAddresses = addresses;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView txt_real_name;
public ViewHolder(View v) {
super(v);
txt_real_name = (TextView) v.findViewById(R.id.txt_real_name);
}
}
@Override
public int getItemCount() {
return mAddresses.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.uchoice_address_list_item, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
final Address address = mAddresses.get(position);
holder.txt_real_name.setText(address.real_name);
}
}//为了看起来直观只贴了部分代码
RecyclerView标准化了ViewHolder,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,onCreateViewHolder()
专门用来生成 ViewHolder,onBindViewHolder()
用来加载数据,分工很明确,比之前所有的逻辑都放在getView()要清晰很多,以上就是RecyclerView的简单用法了
ItemAnimator
ItemAnimator也是一个抽象类,系统为我们提供了一种默认的实现类(DefaultItemAnimator
),添加的方法也很简单:
// 设置item动画
recycler_view.setItemAnimator(new DefaultItemAnimator());
如果我们想实现更多的动画效果呢?别急,已经有人写好很多了,请看:RecyclerViewItemAnimators
CardView
CardView继承自FrameLayout类,可以在一个卡片布局中一致性的显示内容,使用方法跟FrameLayout一样,卡片可以包含圆角和阴影。我们可以使用
android:cardCornerRadius属性指定圆角半径
android:cardBackgroundColor属性设置卡片颜色
android:elevation:设置阴影的大小
最后效果如下: