欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新

 更新時(shí)間:2016年04月29日 14:17:10   作者:IT小火柴  
這篇文章主要介紹了Android使用RecyclerView實(shí)現(xiàn)自定義列表、點(diǎn)擊事件以及下拉刷新的相關(guān)資料,需要的朋友可以參考下

Android使用RecyclerView

1. 什么是RecyclerView

RecyclerView 是 Android-support-v7-21 版本中新增的一個(gè) Widgets,官方對(duì)于它的介紹則是:RecyclerView 是 ListView 的升級(jí)版本,更加先進(jìn)和靈活。

簡單來說就是:RecyclerView是一種新的視圖組,目標(biāo)是為任何基于適配器的視圖提供相似的渲染方式。它被作為ListView和GridView控件的繼承者,在最新的support-V7版本中提供支持。

2. 使用RecyclerView需要掌握什么

Adapter — 包裝數(shù)據(jù)集合并且為每個(gè)條目創(chuàng)建視圖
LayoutManager — 將每個(gè)條目的視圖放置于適當(dāng)?shù)奈恢?br /> OnItemClickListener — 給每個(gè)條目設(shè)置點(diǎn)擊事件
SwipeRefreshLayout — 給RecyclerView添加下拉刷新事件
ItemAnimator — 在每個(gè)條目的視圖的周圍或上面繪制一些裝飾視圖
ItemDecoration — 在條目被添加、移除或者重排序時(shí)添加動(dòng)畫效果

3. 使用RecyclerView前需要準(zhǔn)備什么

添加依賴包(以Android Studio為例)

4. 自定義Adapter

RecyclerView.Adapter包含了一種新型適配器,其實(shí)與以前我們使用的適配器基本類似,只是稍微有所不同,比如viewholder它幫我們封裝好了,不用像以前使用listview的適配器一樣自己去寫viewholder了。

Item視圖如下:

實(shí)例代碼如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

 private List<Model> models;

 public RecyclerAdapter(List<Model> models){
  this.models = models;
 }

 class ViewHolder extends RecyclerView.ViewHolder{

  private ImageView picture;
  private TextView title,text;

  public ViewHolder(View itemView) {
   super(itemView);

   picture = (ImageView) itemView.findViewById(R.id.picture);
   title = (TextView) itemView.findViewById(R.id.title);
   text = (TextView) itemView.findViewById(R.id.text);
  }

  public ImageView getPicture(){
   return picture;
  }

  public TextView getTitle(){
   return title;
  }

  public TextView getText(){
   return text;
  }
 }

 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

  final ViewHolder vh = (ViewHolder) holder;
  vh.getPicture().setImageResource(models.get(position).getPicture());
  vh.getTitle().setText(models.get(position).getTitle());
  vh.getText().setText(models.get(position).getText());
 }

 @Override
 public int getItemCount() {
  return models.size();
 }
}

5. LayoutManager有什么作用

由于RecyclerView已經(jīng)不單單像以前ListView或者GridView一樣,它被作為ListView和GridView控件的繼承者,所以在使用它的時(shí)候需要通過設(shè)置它的LayoutManager去規(guī)定它是哪一種類型,另外也可通過設(shè)置LayoutManager去設(shè)置它是橫向還是縱向的列表,以及是否反轉(zhuǎn)。

縱向列表:(第三個(gè)參數(shù)是設(shè)置是否反轉(zhuǎn),即滑動(dòng)方向)

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
recyclerview.setLayoutManager(mLayoutManager);

橫向列表:

mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

垂直表格布局:

mLayoutManager = new GridLayoutManager(this,2);
recyclerview.setLayoutManager(mLayoutManager);

水平表格布局:(第四個(gè)參數(shù)代表是否反轉(zhuǎn))

mLayoutManager = new GridLayoutManager(this,2,LinearLayoutManager.HORIZONTAL,false);
recyclerview.setLayoutManager(mLayoutManager);

6. 為什么要自己添加OnItemClickListener

RecyclerView有一個(gè)缺點(diǎn),在RecyclerView中,沒有一個(gè)onItemClickListener方法。所以目前在適配器中處理這樣的事件比較好。如果想要從適配器上添加或移除條目,需要明確通知適配器。這與先前的notifyDataSetChanged()方法稍微有些不同。具體操作在適配器代碼中就可以體現(xiàn)。

具體代碼如下:

public class RecyclerAdapter extends RecyclerView.Adapter {

  private List<Model> models;

  public RecyclerAdapter(List<Model> models){
    this.models = models;
  }

  class ViewHolder extends RecyclerView.ViewHolder{

    private ImageView picture;
    private TextView title,text;

    public ViewHolder(View itemView) {
      super(itemView);

      picture = (ImageView) itemView.findViewById(R.id.picture);
      title = (TextView) itemView.findViewById(R.id.title);
      text = (TextView) itemView.findViewById(R.id.text);
    }

    public ImageView getPicture(){
      return picture;
    }

    public TextView getTitle(){
      return title;
    }

    public TextView getText(){
      return text;
    }
  }

  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view,null));
  }

  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    final ViewHolder vh = (ViewHolder) holder;
    vh.getPicture().setImageResource(models.get(position).getPicture());
    vh.getTitle().setText(models.get(position).getTitle());
    vh.getText().setText(models.get(position).getText());

    //如果設(shè)置了回調(diào),就設(shè)置點(diǎn)擊事件
    if (mOnItemClickListener != null){
      vh.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          mOnItemClickListener.onItemClick(vh.itemView,position);
        }
      });
    }
  }

  @Override
  public int getItemCount() {
    return models.size();
  }

  /**
   * ItemClick的回調(diào)接口
   */
  public interface OnItemClickListener{
    void onItemClick(View view,int position);
  }

  private OnItemClickListener mOnItemClickListener;

  public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener){
    this.mOnItemClickListener = mOnItemClickListener;
  }
}

7. 實(shí)現(xiàn)下拉刷新與上拉加載更多

其實(shí)跟以前一樣,原生的ListView或者GridView都不能滿足實(shí)際App的需要,很多時(shí)候都要通過自定義View去實(shí)現(xiàn)列表的下拉刷新和上拉加載,RecyclerView也是一樣,不過這里不會(huì)介紹如何去自定義RecyclerView,相反,我們會(huì)借用SwipeRefreshLayout這個(gè)組件,更快地去實(shí)現(xiàn)列表刷新功能

界面布局如下:

<view
    android:id="@+id/swipeRefreshLayout"
    class="android.support.v4.widget.SwipeRefreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

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

</view>

設(shè)置下拉刷新監(jiān)聽事件:

swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
      @Override
      public void onRefresh() {
        //重新獲取數(shù)據(jù)
        //獲取完成swipeRefreshLayout.setRefreshing(false);
      }
});

設(shè)置上拉加載更多可以通過設(shè)置滑動(dòng)監(jiān)聽事件來實(shí)現(xiàn):

recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE
            && lastVisibleItem + 1 == adapter.getItemCount()) {
          swipeRefreshLayout.setRefreshing(true);

          //分頁獲取數(shù)據(jù)
          //獲取完成swipeRefreshLayout.setRefreshing(false);
        }
      }

      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
      }
    });

8. ItemAnimator 與ItemDecorator

由于RecyclerView里沒有自帶分割線,所以就出現(xiàn)了ItemDecorator,但其實(shí)還有另外一種方法,就是直接在Item界面布局中添加分割線,這樣可以省去很多代碼;
而ItemAnimator簡單來說是會(huì)根據(jù)適配器上收到的相關(guān)通知去動(dòng)畫的顯示組件的修改,添加和刪除等。它會(huì)自動(dòng)添加和移除item的動(dòng)畫。自帶的默認(rèn)效果也不錯(cuò),已經(jīng)非常好了。因?yàn)檫@兩項(xiàng)不是很常用,所以這里就不多加介紹了,有興趣的同學(xué)可以上網(wǎng)找詳細(xì)的資料學(xué)習(xí)。

相關(guān)文章

最新評(píng)論