靈活性比Listview更好的RecycleView

RecycleView:
是Android L版本中新添加的一個用來取代ListView的SDK,它的靈活性與可替代性比listview更好。android

RecyclerView與ListView原理是相似的:
都是僅僅維護少許的View而且能夠展現大量的數據集。
RecyclerView:
一、item的排列方式:兩種佈局管理器:app

LinearLayoutManager
GridLayoutManager

二、操做item的時候提供默認的動畫效果
三、item多種佈局比較方便
四、封裝了item的優化
五、適配器不一樣
不一樣點:
一、分割線,RecyclerView要自定義設置
二、監聽器,RecyclerView沒有條目監聽器,須要在適配器中自定義ide

RecyclerView用如下兩種方式簡化了數據的展現和處理:
使用LayoutManager來肯定每個item的排列方式
爲增長和刪除項目提供默認的動畫效果
也能夠定義本身的LayoutManager和添加刪除動畫佈局

使用RecycleView步驟:
1、添加依賴性能

  //材料設計包
  compile 'com.android.support:design:23.4.0'優化

  //cardview包裹item佈局,美化效果
  compile 'com.android.support:cardview-v7:23.4.0'

  //下拉刷新包裹RecyclerView佈局
  compile 'in.srain.cube:ultra-ptr:1.0.11'動畫

2、相關方法this

  //若是能夠肯定每一個item的高度是固定的,設置這個選項能夠提升性能
  recyclerView.setHasFixedSize(true);設計

  //設置item佈局之間的分割線,三個選擇
  recyclerView_main.addItemDecoration(new DividerGridItemDecoration(mContext))xml

  //設置佈局管理器
  recyclerView.setLayoutManager(LinearLayoutManager、GridLayoutManager)

  //設置動畫效果
  recyclerView.setItemAnimator(new DefaultItemAnimator());

  //設置適配器
  recyclerView.setAdapter(adapter);

  //上拉加載下一頁
  recyclerView_main.addOnScrollListener(//兩個方法:
  線性佈局管理器獲得最後一條item的position;判斷,而後頁碼++)

  //置頂功能
  recyclerView.scrollToPosition(0);

3、實現下拉刷新:

一、SwipeRefreshLayout:(系統自帶的,只是下拉的時候佈局並無被下拉,須要自定義)
  //包裹RecyclerView佈局
  //漸變顏色
  swipeRefreshLayout.setColorSchemeColors(...)
  //監聽刷新
  swipeRefreshLayout.setOnRefreshListener(//curPage = 1;loadNetworkData();)
  //加載完成,消失圖標
  swipeRefreshLayout.setRefreshing(false);

二、第三方類庫:library_pullToReflect
  //佈局:PullToRefreshRecyclerView

  //用法和RecycleView相似

  //如設置佈局管理器、設置分割線或者分割空間、set item的高度是固定的

  //addOnScrollListener(//幾乎很RecycleView同樣,下拉刷新)

三、PtrFrameLayout:(須要導包,依賴項)

  //佈局:PtrFrameLayout包裹RecyclerView

  //有兩種:
  ①、旋轉圓圈的header(相似SwipeRefreshLayout)

    Ⅰ、new一個StoreHouseHeader header,而後設置:
      header.setBackgroundColor
      header.setTextColor
      header.initWithString("LOADING...")
    Ⅱ、添加header,ptrFrameLayout.setHeaderView(header);
    Ⅲ、綁定UI與刷新狀態的監聽:ptrFrameLayout.addPtrUIHandler(header);
    Ⅳ、添加刷新動做監聽:ptrFrameLayout.setPtrHandler(new PtrDefaultHandler)

  ②、默認的經典header(相似pullTorefresh效果)

    Ⅰ 、new一個PtrClassicDefaultHeader
    Ⅱ、添加header,ptrFrameLayout.setHeaderView(header);
    Ⅲ、綁定UI與刷新狀態的監聽:ptrFrameLayout.addPtrUIHandler(header);
    Ⅳ、添加刷新動做監聽:ptrFrameLayout.setPtrHandler(new PtrDefaultHandler)

  // 刷新完成,讓刷新Loading消失
  ptrFrameLayout_main.refreshComplete();

4、RecyclerView的適配器

  Ⅰ 、自定義適配器繼承 RecyclerView.Adapter<RecyclerView.ViewHolder>
    導包正確的化能夠簡寫成Adapter<ViewHolder>

  Ⅱ、聲明屬性,Context 、 數據源 、 LayoutInflater
    構造器初始化

  Ⅲ、重寫方法:
    onCreateViewHolder(parent , typeView):填充View,並返回new ViewHolder(view)
    onBindViewHolder(holder , position);賦值,並加載圖片
    getItemId(position)

  Ⅳ、ViewHolder內部類 繼承 RecyclerView.ViewHolder
    聲明UI控件,構造器初始化

  Ⅴ、從新加載數據:reloadListView(數據源 、 isClear)

  Ⅵ、額外的方法:
    notifyDataSetChanged()
    notifyItemInserted(position)
    notifyItemRangeInserted(positionStart, itemCount)
    notifyItemRemoved(position)
    notifyItemChanged(position)

  Ⅶ、若是須要設置單擊監聽、長按監聽
    一、interface OnItemClickedListener:兩個抽象方法
      void onItemClick(int position)
      boolean onItemLongClick(int position)
    二、聲明接口對象:listener、聲明RecyclerView對象,並在構造器中傳入RecyclerView對象
    三、setOnItemClickedListener(接口對象){this.listener = listener}
    四、ViewHolder要實現View的單擊、長按監聽器
    五、重寫單擊監聽器
      if (listener != null) {
        int position = recyclerView.getChildPosition(v)
        listener.onItemClick(position)
      }
        長按監聽器:
      if (listener != null) {
        int position = recyclerView.getChildPosition(v)
        return listener.onItemLongClick(position)
      }
      return false
  六、主頁就能夠調用setOnItemClickedListener(new ...)

附CardView:
  <android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    android:elevation="5dp"
    app:cardCornerRadius="10dp">

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

相關文章
相關標籤/搜索