欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android RecyclerView 基础知识详解

程序员文章站 2024-03-06 22:00:20
本周的谷歌i/o大会带来了很多关于android的振奋人心的消息。可能我们需要较长的时间来消化android l引入的新东西。 这些天我一直在研究recyclerview...

本周的谷歌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 基础知识详解

以上就是对android recyclerview 的基础资料的详解,后续继续补充相关资料,谢谢大家对本站的支持!