android最佳实践(三)

这是一个系列,咱们将其命名为android最佳实践,若是你尚未看以前的文章:android

Android最佳实践(一)git

android最佳实践(二)github

android最佳实践(四)segmentfault

android最佳实践(五)less

Android最佳实践(六)之扫描二维码模块ide

现阶段,咱们建立了最简单的Android项目,如今在此公布github连接https://github.com/neuyu/android-best-practices,但愿你们多多支持。布局

由于以前谈到过包结构的定义,我选择第一种方式,按照Android特性定义,因此你的包结构应该是这样的:gradle

图片描述

RecyclerView

在MainActivity中,咱们须要用到RecyclerView这一新控件,那么如何引用,如何使用它呢?在gradle文件中添加库依赖:this

compile 'com.android.support:recyclerview-v7:23.1.1'

这样咱们可使用RecyclerView啦。spa

RecyclerView的用法

那么好了,recyclerView是一个控件,因此你须要在xml中进行声明,固然其也支持在Java代码中动态构建。

经过实例化后,你须要为其设置layoutManager和adapter。

图片描述

关于layoutManager,用来肯定每个item如何进行排列摆放,什么时候展现和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了建立过多的View和频繁的调用findViewById方法(与ListView原理相似)。

目前SDK中提供了三种自带的LayoutManager:

  • LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

基于原型图:

LinearLayoutManager的效果图以下:

图片描述

GridLayoutManager的效果图以下所示:

图片描述

关于adapter

咱们使用到了CardView,而其也是v7包里单独存在的,因此你须要在gradle文件中申明:

compile 'com.android.support:cardview-v7:23.1.1'

注意每一个cardView都是一个item,相似于listview,所以你能够为CardView添加自定义布局。以下所示:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                    xmlns:card_view="http://schemas.android.com/apk/res-auto"
                                    xmlns:tools="http://schemas.android.com/tools"
                                    android:id="@+id/list_card_view"
                                    style="@style/cardStyle"
                                    android:clickable="true"
                                    android:foreground="?android:attr/selectableItemBackground"
                                    card_view:cardCornerRadius="4dp"
                                    card_view:cardElevation="4dp">

    <RelativeLayout
        style="@style/cardRelativeLayoutStyle"
        tools:ignore="UselessParent">

        <TextView
            android:id="@+id/itemText"
            style="@style/cardItem"/>

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

对应的adapter须要继承RecycleView.Adapter,其为泛型,须要传入你自定义的ViewHolder。因此你也须要定义你的静态内部类,让其继承RecycleView.ViewHolder,而且RecycleView并无相关itemClick点击事件,因此你须要在静态类中定义点击事件,具体以下所示:

public class CardViewAdapter extends RecyclerView.Adapter<CardViewAdapter.CardViewHolder>{
    
    public CardViewAdapter(List<ItemTest> list, Context context){
        mList=list;
        mContext=context;
    }
    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View item= LayoutInflater.from(mContext).inflate(R.layout.adapter_item,parent,false);

        return new CardViewHolder(item, new CardViewHolder.ClickListener() {
            @Override
            public void onWholeClick(int position) {
                redirectToDetail(position);
            }
        });
    }
     public static class CardViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
         public CardViewHolder(View itemView,ClickListener clickListener) {
              super(itemView);
              this.mClickListener=clickListener;
              list_card_view=(CardView)itemView.findViewById(R.id.list_card_view);
              list_card_view.setOnClickListener(this);
    }
     public interface ClickListener{
            void onWholeClick(int position);
    }
    }
}

关于RecycleView和CardView的相关特性和深刻理解,将会在下一篇介绍。