RecyclerView、CardView

Android L的support library中包含了两个新的组件(RecyclerViewCardView),他们可以用于显示复杂的布局而且都默认采用了Material的风格。

RecyclerView

很多人将它跟ListView对比,说它升级版的ListView,其实它可以做的更多,比如GridView也可以用它来代替,还比如listView中item的样式有多种,也可以通过它来实现,拓展性很强,这里只是简单介绍下它们的使用方法,就以薄荷的收货地址为例,没用RecyclerView的样子如下图:

recyclerview-cardview1

使用起来很简单

  1. 添加依赖

    compile 'com.android.support:recyclerview-v7:21.0.3'
    compile 'com.android.support:cardview-v7:21.0.3'
    
  2. 添加xml文件

    <android.support.v7.widget.RecyclerView
      android:id="@+id/recycler_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />
    
  3. 初始化(跟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:设置阴影的大小

最后效果如下:

recyclerview-cardview