国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

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

2019-12-12 06:27:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

Android使用RecyclerView

1. 什么是RecyclerView

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

簡(jiǎn)單來(lái)說(shuō)就是:RecyclerView是一種新的視圖組,目標(biāo)是為任何基于適配器的視圖提供相似的渲染方式。它被作為L(zhǎng)istView和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è)條目的視圖的周?chē)蛏厦胬L制一些裝飾視圖
ItemDecoration ― 在條目被添加、移除或者重排序時(shí)添加動(dòng)畫(huà)效果

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

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

4. 自定義Adapter

RecyclerView.Adapter包含了一種新型適配器,其實(shí)與以前我們使用的適配器基本類(lèi)似,只是稍微有所不同,比如viewholder它幫我們封裝好了,不用像以前使用listview的適配器一樣自己去寫(xiě)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一樣,它被作為L(zhǎng)istView和GridView控件的繼承者,所以在使用它的時(shí)候需要通過(guò)設(shè)置它的LayoutManager去規(guī)定它是哪一種類(lèi)型,另外也可通過(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中,沒(méi)有一個(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都不能滿(mǎn)足實(shí)際App的需要,很多時(shí)候都要通過(guò)自定義View去實(shí)現(xiàn)列表的下拉刷新和上拉加載,RecyclerView也是一樣,不過(guò)這里不會(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)聽(tīng)事件:

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 萨迦县| 丹凤县| 玉树县| 滕州市| 兰考县| 嘉禾县| 东丰县| 昔阳县| 文山县| 济南市| 鄂州市| 茂名市| 陇川县| 甘洛县| 米林县| 道孚县| 昂仁县| 滁州市| 焉耆| 信丰县| 翁源县| 武平县| 积石山| 乐昌市| 调兵山市| 湖北省| 库车县| 连江县| 永嘉县| 平泉县| 穆棱市| 绥芬河市| 武城县| 沙洋县| 安达市| 太白县| 闵行区| 长沙市| 屯门区| 石景山区| 琼结县|