安卓RecyclerView的使用以及抽取基類

安卓RecyclerView的使用以及抽取基類

1.引入:

在moudle中的build.gradle文件裏,找到dependencies,添加關於recyclerView的引用:

compile 'com.android.support:recyclerview-v7:24.2.0'  //這裏的版本需要和V7包相對

其實design包中含有Material Design相關的很多控件,其中也包括了recyclerView的代碼,所以你也可以通過引用design包來使用recyclerView:

compile 'com.android.support:design:23.2.0'   //同樣的版本需要一樣

2.在Xml中的使用:

<android.support.v7.widget.RecyclerView
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

3.在代碼中的使用:

  • RecyclerView需要設置樣式才能顯示出數據:
new LinearLayoutManager(getApplicationContext()); //顯示爲listView樣式
new GridLayoutManager(getApplicationContext(),3); //顯示爲Grid樣式
//顯示爲橫向的Grid  true爲是否逆轉
new GridLayoutManager(getApplicationContext(), 3, GridLayoutManager.HORIZONTAL, false); 
//顯示爲瀑布流 可以設置方向
new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
mRv = (RecyclerView) findViewById(R.id.rv); //找到控件
 //必須要設置layout樣式才能使用
 mLinearLayoutManager = new LinearLayoutManager(getApplicationContext());
 mRv.setLayoutManager(mLinearLayoutManager);
  • 可以給每個Item設置動畫效果,可也自定義可以使用第三方:

我這裏使用的是第三方,自定義的比較麻煩,下面是依賴地址:

compile 'jp.wasabeef:recyclerview-animators:2.2.6'

下面是代碼中的使用:

 //可以給item設置動畫   使用的是第三方動畫庫
mRv.setItemAnimator(new FadeInRightAnimator());
  • RecyclerView必須自定義分割線,這裏也是使用的第三方

    compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'
//手動設置分割線    使用的第三方
mRv.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
        .color(Color.RED)  //顏色
        .size(2)        //大小
        .margin(0,2)    //距離
        .build());

5.Adpater類代碼

RecyclerView中的Adapter與ListView中的Adapter不同:這裏直接加上了樣式的選擇.

public class myAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

  //確定數據個數
    @Override
    public int getItemCount() {
        return mData.size();
    }

    @Override
     public int getItemViewType(int position) {
            //可能根據數據的字段來指定對應的type
            if(position%2==0){
                return TYPE_ONE;
            }else{
                return TYPE_TWO;
            }
    }
    //確定佈局
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //當有多個Item樣式時先進行判斷
        if (viewType == TYPE_ONE){
            //加載佈局
            View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            //創建ViewHolder對象
            MyViewHolder myHolederView = new MyViewHolder(inflate);
            //查找控件
            myHolederView.tv = (TextView) inflate.findViewById(tv);
            return myHolederView;
        }
        //顯示不同的佈局
        if (viewType == TYPE_TWO){
            //創建不同的ViewHolder
           return null;
        }
        return  null;
    }
    //設置值
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
        //有可能會有多種Item的顯示樣式,所有在設置值之前要進行判斷
        if (getItemViewType(position) == TYPE_ONE){
            //設置值
            MyViewHolder viewHolder = (MyViewHolder) holder;
            viewHolder.tv.setText(mData.get(position));
        }
        if (getItemViewType(position) == position){
            //強轉成不同的ViewHolder進行賦值
        }
        //設置Item的點擊事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //點擊事件回調到Activity
                if (mListerent != null){
                    mListerent.onitemLister(v,position);
                }
            }
        });

    }
}
  • RecyclerView中不提供Item的點擊事件,這是只能在Adapter中設置,但爲了更好的編輯代碼,需要把點擊事件回調到Activity中進行處理

    創建一個接口回調點擊事件:

    //設置一個回調的接口
    interface  IRecyclerItemChangeListerent {
       void onitemLister(View v,int postion);
    }

6.上面介紹是對RecyclerView的初步使用,在項目中爲了減低耦合,需要對Adapter類進行抽取,下面代碼進行了簡單的抽取,可供參考使用:

public abstract class BaseAdapterss<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    ArrayList<T> mData;                       //數據
    IRecyclerItemChangeListerent mListerent;  //回調接口

    //設置數據的方法
    public  void setData(ArrayList<T>  data ){
        this.mData = data;
    }
    //獲取顯示數量
    @Override
    public int getItemCount() {
        return mData != null ? mData.size() : 0;
    }

    //設置點擊事件藉口回調
    public  void  setListerent(IRecyclerItemChangeListerent listerent){
        mListerent = listerent;
    }
    //設置一個回調的接口
    interface  IRecyclerItemChangeListerent {
        void onitemLister(View v, int postion);
    }
    //返回Item顯示的不同佈局
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //抽象方法,子類出具體實現
        return getLayout(parent,viewType);
    }
    //對Item的數據進行賦值
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
            //抽象方法子類去具體實現
            setItemData(holder,position);
            //設置Item的點擊事件
            holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //點擊事件回調到Activity
                if (mListerent != null){
                    mListerent.onitemLister(v,position);
                }
            }
        });
    }
    //抽象方法,子類實現具體操作
    protected abstract void setItemData(RecyclerView.ViewHolder holder, int position);
    protected  abstract   RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType);
}
  • 模擬子類繼承

    //具體操作
    public class MyAdapters extends BaseAdapterss<String> {
    
      private static final int TYPE_ONE = 0;   //item的顯示樣式
      private static final int TYPE_TWO = 1;   //item的顯示樣式
    
      @Override
      public int getItemViewType(int position) {
          //可能根據數據的字段來指定對應的type
          if(position%2==0){
              return TYPE_ONE;
          }else{
              return TYPE_TWO;
          }
      }
    
      @Override
      protected void setItemData(RecyclerView.ViewHolder holder, int position) {
          //有可能會有多種Item的顯示樣式,所有在設置值之前要進行判斷
          if (getItemViewType(position) == TYPE_ONE){
              //設置值
              MyViewHolder viewHolder = (MyViewHolder) holder;
              viewHolder.tv.setText(mData.get(position));
          }
          if (getItemViewType(position) == position){
              //強轉成不同的ViewHolder進行賦值
          }
      }
    
      @Override
      protected RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType) {
          //當有多個Item樣式時先進行判斷
          if (viewType == TYPE_ONE){
              //加載佈局
              View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,                                parent, false);
              //創建ViewHolder對象
              MyViewHolder myHolederView = new MyViewHolder(inflate);
              //查找控件
              myHolederView.tv = (TextView) inflate.findViewById(tv);
              return myHolederView;
          }
          //顯示不同的佈局
          if (viewType == TYPE_TWO){
              //創建不同的ViewHolder
              return null;
          }
          return  null;
      }
    }

如有不懂的可以下載Dome看看,地址:https://github.com/MSHAO1/RecyclerViewDome

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章