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

首頁 > 系統 > Android > 正文

Android RecyclerView 基礎知識詳解

2019-12-12 05:21:17
字體:
來源:轉載
供稿:網友

本周的谷歌I/O大會帶來了很多關于Android的振奮人心的消息。可能我們需要較長的時間來消化Android L引入的新東西。

這些天我一直在研究RecyclerView,并想在此給各位分享一下到目前為止我的成果。

RecyclerView是什么?

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

在開發RecyclerView時充分考慮了擴展性,因此用它可以創建想到的任何種類的的布局。但在使用上也稍微有些不便。這就是Android――要完成一件事情總不是那么容易。

如果使用RecyclerView,你需要了解以下三個元素:

  1. RecyclerView.Adapter
  2. LayoutManager
  3. ItemAnimator

RecyclerView.Adapter

RecyclerView包含了一種新型適配器。它與現在使用的適配器類似,但也稍有不同,例如它需要使用ViewHolder。使用時需要重寫兩個主要方法:一個用來展現視圖和它的持有者,而另一個用來把數據綁定到視圖上。這么做的好處是,第一種方法只有當我們真正需要創建一個新視圖時才被調用,不需要檢查它是否已經被回收。

; html-script: false ]public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {  private List<ViewModel> items;  private int itemLayout;  public MyRecyclerAdapter(List<ViewModel> items, int itemLayout) {    this.items = items;    this.itemLayout = itemLayout;  }  @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);    return new ViewHolder(v);  }  @Override public void onBindViewHolder(ViewHolder holder, int position) {    ViewModel item = items.get(position);    holder.text.setText(item.getText());    holder.image.setImageBitmap(null);    Picasso.with(holder.image.getContext()).cancelRequest(holder.image);    Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);    holder.itemView.setTag(item);  }  @Override public int getItemCount() {    return items.size();  }  public static class ViewHolder extends RecyclerView.ViewHolder {    public ImageView image;    public TextView text;    public ViewHolder(View itemView) {      super(itemView);      image = (ImageView) itemView.findViewById(R.id.image);      text = (TextView) itemView.findViewById(R.id.text);    }  }}

這是一個簡單的適配器,但是事情逐漸開始變得有點復雜。在RecyclerView中,沒有一個onItemClickListener方法(至少我沒有發現)。所以適配器是一個處理事件的良好的候選人。

如果想要從適配器上添加或移除條目,需要明確通知適配器。這與先前的notifyDataSetChanged()方法稍微有些不同。

; html-script: false ]public void add(ViewModel item, int position) {  items.add(position, item);  notifyItemInserted(position);}public void remove(ViewModel item) {  int position = items.indexOf(item);  items.remove(position);  notifyItemRemoved(position);}

LayoutManager

這個類決定視圖被放在畫面中哪個位置,但這只是它的眾多職責之一。它可以管理滾動和循環利用。

LayoutManager只有一個叫做LinearLayoutManager的實現類,它有1500多行代碼。但從這一點就可以看出它有多復雜。管理器可以模擬列表視圖(包括橫向和縱向),但沒有頁眉和頁尾。

為LayoutManager編寫子類不太適合新手,我們需要依靠社區來發掘RecyclerView的全部潛力。與這個例子一起,在短時間內我會上傳一個GridView控件的實現。

我認為這背后的關鍵是要仿照LinearLayoutManager的代碼創建一個BaseLayoutManager,并且基于此進行擴展。或許support-v7的最終版本會提供更多、更好的實現。

ItemAnimator

ItemAnimator會根據適配器上收到的通知動畫顯示視圖組的修改。基本上,它會自動顯示添加和移除條目動畫。這也不是一個簡單的類,但我們發現DefaultItemAnimator已經可以運行得很好了。

RecyclerView設置

所以最后,如果想要初始化一個運行的RecyclerView,你需要做這樣的事情:

; html-script: false ]RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);recyclerView.setHasFixedSize(true);recyclerView.setAdapter(new MyRecyclerAdapter(createMockList(), R.layout.item));recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.setItemAnimator(new DefaultItemAnimator());

setHasFixedSize()方法用來使RecyclerView保持固定的大小,該信息被用于自身的優化。

總結

RecyclerView確實是一個強大的視圖,它為開發者提供了無限的擴展能力。學習曲線可能會非常陡峭。但我相信,不久Android社區就會發布LayoutManager超棒的實現。

我在創建一個github倉庫,在那里可以找到這個例子。它是我計劃創建的一個擴展庫的基礎。你可以測試GridView的實現。歡迎各種形式的反饋。

以上就是對Android RecyclerView 的基礎資料的詳解,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 聊城市| 长治县| 达州市| 克拉玛依市| 来安县| 武邑县| 祥云县| 温州市| 久治县| 区。| 山西省| 天峨县| 鹤庆县| 叙永县| 大渡口区| 旬邑县| 丹巴县| 寿光市| 津南区| 桑日县| 罗源县| 琼结县| 兴国县| 河西区| 武穴市| 安泽县| 扎兰屯市| 南江县| 乐业县| 宝山区| 浪卡子县| 宽甸| 延安市| 青阳县| 凤冈县| 砀山县| 兴山县| 六盘水市| 濮阳市| 门源| 乌兰察布市|