Android 5.X 新特性详解——列表与卡片

Posted 黄飞_hf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 5.X 新特性详解——列表与卡片相关的知识,希望对你有一定的参考价值。

RecyclerView

android 5.X 中将使用了很久的ListView做了升级,增加了一个使用更方便、效率更高的控件——RecyclerView。RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,它同样拥有item回收复用的功能,但是RecyclerView可以直接把ViewHolder的实现封装起来,用户只要实现自己的ViewHolder就可以了,该组件会自动帮你回收复用每一个item。

使用RecyclerView的重点与使用ListView一样,需要使用一个合适的数据适配器来加载数据,RecyclerView中需要重写的很多方法都似曾相识,不过RecyclerView更加先进的是,它已经封装好了ViewHolder,只要实现功能就可以了,而使用上仍然是跟在ListView中使用ViewHolder一样,代码如下所示:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> 

    private List<String> mData;
    public OnItemClickListener mItemClickListener;

    public RecyclerAdapter(List<String> data)
        mData = data;
    

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
        // 将布局转化为View并传递给RecyclerView封装好的ViewHolder
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rc_item, parent, false);
        return new ViewHolder(view);
    

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) 
        // 建立起ViewHolder中视图与数据的关联
        holder.mTextView.setText(mData.get(position) + position);
    

    @Override
    public int getItemCount() 
        return mData.size();
    

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener

        TextView mTextView;

        public ViewHolder(View itemView) 
            super(itemView);
            mTextView = (TextView) itemView;
            mTextView.setOnClickListener(this);
        

        // 通过接口回调来实现RecyclerView的点击事件
        @Override
        public void onClick(View view) 
            if(mItemClickListener != null)
                mItemClickListener.onItemClick(view, getLayoutPosition());
        
    

    public void setOnItemClickListener(OnItemClickListener itemClickListener) 
        this.mItemClickListener = itemClickListener;
    

    /**
     * Android并没有给RecyclerView增加点击事件,所以我们需要自己使用接口回调机制,创建一个点击事件的接口
     */
    public interface OnItemClickListener 
        void onItemClick(View view, int position);
    

Google在RecyclerView中定义了LayoutManager来帮助开发者更加方便地创建不同的布局,下面的例子中就演示了如何创建简单的水平和竖直两种布局方式。当然,也可以通过自定义LayoutManager来创建自己的布局,代码如下:

public class RecyclerActivity extends Activity 

    private RecyclerView mRcList;
    private RecyclerAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private Spinner mSpinner;
    private List<String> mData = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler);

        mRcList = (RecyclerView) findViewById(R.id.rc_list);
        mLayoutManager = new LinearLayoutManager(this);
        mRcList.setLayoutManager(mLayoutManager);
        mRcList.setHasFixedSize(true);

        // 设置显示动画
        mRcList.setItemAnimator(new DefaultItemAnimator());
        mSpinner = (Spinner) findViewById(R.id.spinner);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) 
                if (position == 0) 
                    // 设置为线性布局
                    mRcList.setLayoutManager(new LinearLayoutManager(RecyclerActivity.this));
                 else if (position == 1) 
                    // 设置为表格布局
                    mRcList.setLayoutManager(new GridLayoutManager(RecyclerActivity.this, 3));
                
            

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) 

            
        );
        // 增加测试数据
        mData.add("Recycler");
        mData.add("Recycler");
        mData.add("Recycler");
        mAdapter = new RecyclerAdapter(mData);
        mRcList.setAdapter(mAdapter);
        mAdapter.setOnItemClickListener(new RecyclerAdapter.OnItemClickListener() 
            @Override
            public void onItemClick(final View view, int position) 
                // 设置点击动画
                view.animate().translationZ(15).setDuration(300)
                        .setListener(new AnimatorListenerAdapter() 
                            @Override
                            public void onAnimationEnd(Animator animation) 
                                super.onAnimationEnd(animation);
                                view.animate().translationZ(1).setDuration(500).start();
                            
                        ).start();
            
        );
    

    public void addRecycler(View view) 
        mData.add("Recycler");
        mAdapter.notifyDataSetChanged();
    

    public void delRecycler(View view) 
        int size = mData.size();
        if (size > 0) 
            mData.remove(size - 1);
            mAdapter.notifyDataSetChanged();
        
    

在程序中,使用Spinner来选择线性布局管理器还是表格布局管理器,并给按钮增加了点击动画效果,效果图如下所示。

CardView

CardView是一个容器类布局,只是它提供了卡片这样一种形式。开发者可以定义卡片的大小和视图高度,并设置圆角的角度。不过在使用CardView时,首先需要在项目中引入com.android.support:cardview-v7:23.+的依赖。其次在布局文件中使用CardView的时候需要引入一个新的命名空间——xmlns:card_view=”http://schemas.android.com/apk/res-auto”。这样才可以通过自定义的命名空间来引用它的两个属性。

card_view:cardBackgroundColor="@color/"
card_view:cardCornerRadius="8dp"

这两个属性非常简单,第一个是设置背景颜色,第二个是设置圆角的角度。CardView使用的示例XML代码如下:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardview"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:layout_marginTop="40dp"
    card_view:cardBackgroundColor="@color/colorAccent"
    card_view:cardCornerRadius="8dp"
    android:elevation="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_margin="@dimen/fab_margin"
        android:gravity="center"
        android:text="I am a CardView"
        android:textSize="30sp" />


</android.support.v7.widget.CardView>

效果图如下所示:

代码地址

以上是关于Android 5.X 新特性详解——列表与卡片的主要内容,如果未能解决你的问题,请参考以下文章

Android 5.X 新特性详解——Material Design 动画效果

Android 5.X 新特性详解——主题Palette阴影着色和裁剪

Android 5.X 新特性详解——Notification

Android 5.X 新特性详解——Notification

Android 5.X 新特性详解——Activity过渡动画

Android 5.X新特性