Android控件recyclerlistviewView和ListView的异同

Android中的RecyclerView: 基础知识 - 博客 - 伯乐在线
& Android中的RecyclerView: 基础知识
本周的谷歌I/O大会带来了很多关于Android的振奋人心的消息。可能我们需要较长的时间来消化Android L引入的新东西。
这些天我一直在研究RecyclerView,并想在此给各位分享一下到目前为止我的成果。
RecyclerView是什么?
RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式。它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持。
在开发RecyclerView时充分考虑了扩展性,因此用它可以创建想到的任何种类的的布局。但在使用上也稍微有些不便。这就是Android——要完成一件事情总不是那么容易。
如果使用RecyclerView,你需要了解以下三个元素:
RecyclerView.Adapter
LayoutManager
ItemAnimator
RecyclerView.Adapter
RecyclerView包含了一种新型适配器。它与现在使用的适配器类似,但也稍有不同,例如它需要使用ViewHolder。使用时需要重写两个主要方法:一个用来展现视图和它的持有者,而另一个用来把数据绑定到视图上。这么做的好处是,第一种方法只有当我们真正需要创建一个新视图时才被调用,不需要检查它是否已经被回收。
public class MyRecyclerAdapter extends RecyclerView.Adapter&MyRecyclerAdapter.ViewHolder& {
private List&ViewModel&
private int itemL
public MyRecyclerAdapter(List&ViewModel& items, int itemLayout) {
this.items =
this.itemLayout = itemL
@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 ImageV
public TextV
public ViewHolder(View itemView) {
super(itemView);
image = (ImageView) itemView.findViewById(R.id.image);
text = (TextView) itemView.findViewById(R.id.text);
这是一个简单的适配器,但是事情逐渐开始变得有点复杂。在RecyclerView中,没有一个onItemClickListener方法(至少我没有发现)。所以适配器是一个处理事件的良好的候选人。
如果想要从适配器上添加或移除条目,需要明确通知适配器。这与先前的notifyDataSetChanged()方法稍微有些不同。
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,你需要做这样的事情:
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超棒的实现。
我在创建一个,在那里可以找到这个例子。它是我计划创建的一个扩展库的基础。你可以测试GridView的实现。欢迎各种形式的反馈。
关于作者:
可能感兴趣的话题
o 104 回复
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线
赞助云主机Android控件RecyclerView和ListView的异同_百度知道
Android控件RecyclerView和ListView的异同
提问者采纳
目标是为任何基于适配器的视图提供相似的渲染方式,在最新的support-V7版本中提供支持。它被作为ListView和GridView控件的继承者RecyclerView是一种新的视图组。 在开发RecyclerView时充分考虑了扩展性
其他类似问题
为您推荐:
android的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Android控件RecyclerView和ListView的异同_百度知道
Android控件RecyclerView和ListView的异同
提问者采纳
ViewHolder 则变成了必须,Android 5.ViewHolder 被BaseAdapter使用.ItemDecoration类来实现,并添加MultiChoiceModeListener。如果你想要添加间隔符。OthersListView可以设置选择模式,但是却给予开发人员拦截触摸事件更多的控制权限.AdapterDataObserver 就是这个观察者,以将posiiton绑定到上面(可以通过API查看 RecyclerView,你可以应用官方示例中的 DividerItemDecoration。只不过不使用ViewHolder的话,但这的确增加了开发人员的负担。它主要包含以下几处新的特性Android是一个不断进化的平台,且这只是一种推荐的使用方式。然而,如果你比较懒,RecyclerView是ListView的豪华增强版。后面随着Android的进化。或者,不使用当然也可以,删除或添加item时, RecyclerView,无论是ListView亦或是RecyclerView,ListView并不是设计来做这件事情的,不想自定义ItemAnimator,我们只需要在布局文件中对ListView添加如下属性即可。RecyclerView,可以支持水平和竖直方向上滚动的列表,在滚动上面的功能扩展了许多。同时,这将导致ListView性能展示迟缓。同时我们也能够通过registerDataObserver在Adapter中注册一个观察者,这不是必须的,支持网格展示,你必须使用RecyclerView,RecyclerView.Adapter 的实现的。而RecyclerView则通过RecyclerView,RecyclerView在默认情况下并不在item之间展示间隔符,Android API没有提供ListView在水平方向上面滚动的支持.OnItemClickListener接口来探测点击事件。 RecyclerView。只不过在ListView中。相比较于ListView,但是请想念我。ViewHolderViewHolder是用来保存视图引用的类、CursorAdapter和SimpleCursorAdapter.java 文件。GridLayoutManager 。RecyclerView也有这个特性,正如BaseAdapter对ListView所做的那样。ListView有三个Adapter的默认实现。View Code有趣的是,ViewHolder需要自己来定义,getView是最重要的方法.ViewHolder#getPosition() 方法)。ItemAnimator列表动画是一个全新的,如ViewHolder,RecyclerView的Adapter则拥有除了内置的内DB游标和ArrayList的支持之外的所有功能,正如官方文档所言,但它却解决了ListView面临的上述不使用自定义ViewHolder时所面临的问题,尽管实现起来稍显复杂,可以水平或者竖直滚动、删除或移动item时处理动画效果:LinearLayoutManager 。它可以支持多种类型列表的展示要求,分别是ArrayAdapter,item是无法产生动画效果的,是所有神奇的事情发生的地方。OnItemTouchListenerListView通过AdapterView。或许有多种方式实现水平滑动,Google的Chat Hasse推荐使用 ViewPropertyAnimator 属性动画来实现上述需求、拥有无限可能的维度.OnItemTouchListener接口来探测触摸事件,你还可以使用 DefaultItemAnimator ,它将视图跟position绑定起来。StaggeredGridLayoutManager ,ItemDecorator。起初的Android API中,主要如下。它虽然增加了实现的难度。AdapterListView的Adapter中,可以支持交叉网格风格的列表。但是RecyclerView相较于ListView,如展示图片的画廊,LayoutManager。而在RecyclerView中使用 RecyclerView,而RecyclerView则没有此功能。官方推荐我们采用RecyclerView来取代ListView。ItemDecoration在ListView中如果我们想要在item之间添加间隔符.0的v7版本支持包中引入了新的RecyclerView控件.ItemAnimator 则被提供用于在RecyclerView添加,类似于瀑布流或者Pinterest。尽管Google的家伙有意地将这个问题遗留给我们去自定义间隔符,ListView每次getView的时候都会调用findViewById(int),SmothScroller以及增加或删除item时item动画等,我们必须采取措施将数据提供给Adapter。LayoutManager我们知道ListView只能在垂直方向上滚动
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁以下内容为原创,转载请注明:
来自天天博客:
以前写过一篇&()&,用于在有很多不同类型不同布局的item的时候怎么去较好的进行view的绑定和数据的渲染,但是这个是针对ListView写的。这次我针对RecyclerView也重新实现了一遍。
接下来演示下怎么去渲染不同类型的item,并且使它支持下拉刷新,滚动到底部显示加载进度条显示。
以下所有的封装都在项目中:
使用的方式如下:
1 final View footerView = LayoutInflater.from(context).inflate(R.layout.recycler_view_item_type_footer, null);
不知道为什么在xml设置的&android:layout_width="match_parent"&无效了,需要在这里重新设置
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
footerView.setLayoutParams(lp);
recyclerView.setHasFixedSize(true);
final ABaseLinearLayoutManager layoutManager = new ABaseLinearLayoutManager(context);
layoutManager.setOnRecyclerViewScrollLocationListener(recyclerView, new OnRecyclerViewScrollLocationListener() {
public void onTopWhenScrollIdle(RecyclerView recyclerView) {
Logger.d(TAG, "onTopWhenScrollIdle...");
public void onBottomWhenScrollIdle(RecyclerView recyclerView) {
Logger.d(TAG, "onBottomWhenScrollIdle...");
footerView.setVisibility(View.VISIBLE);
ThreadPool.go(new Runtask&Object, Object&() {
public Object runInBackground() {
ABThreadUtil.sleep(3000);
return null;
public void onResult(Object result) {
super.onResult(result);
refreshLayout.setRefreshing(false);
footerView.setVisibility(View.GONE);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
layoutManager.getRecyclerViewScrollManager().addScrollListener(recyclerView, new OnRecyclerViewScrollListener() {
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
refreshLayout.setEnabled(layoutManager.findFirstCompletelyVisibleItemPosition() == 0);
recyclerView.setLayoutManager(layoutManager);
initData();
adapter = new PersonTypeAdapter(context, personList, null, footerView);
adapter.setOnRecyclerViewListener(this);
recyclerView.setAdapter(adapter);
refreshLayout.setColorSchemeColors(Color.BLUE, Color.RED, Color.YELLOW, Color.GREEN);
refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
public void onRefresh() {
ThreadPool.go(new Runtask&Object, Object&() {
public Object runInBackground() {
ABThreadUtil.sleep(3000);
return null;
public void onResult(Object result) {
super.onResult(result);
refreshLayout.setRefreshing(false);
footerView.setVisibility(View.GONE);
如上述代码:
Line1:从布局文件中inflate出一个View实例,这个View实例,下面会被用于作为下载提示的footer。
Line8:生成一个实例,显然这个类是继承LinearLayoutManager之后扩展的,详见:,这个类对滑动的监听进行了扩展,可以监听滑动到顶部或者底部的事件
Line9~34:设置滑动到顶部或底部的监听器,然后一旦滑动到底部则加载更多数据。
Line36~45:也是设置滑动监听器,滑动过程中如果不是处在第一个item,如果是,则就可以下拉使用SwipeRefreshLayout进行刷新,如果不是则,仅用SwipeRefreshLayout。之所以需要做这个处理,是因为Google事件处理的一个bug--。
Line50:使用了一个PersonTypeAdapter,这个类继承了,这个类继承RecyclerView.Adapter实现了对不同type渲染数据的封装。
接下来重点分析下ABRecyclerViewTypeExtraViewAdapter这个类(这个类在平常使用时不需要关注):
* Author: wangjie
* Email: tiantian.china.
* Date: 1/22/15.
6 public abstract class ABRecyclerViewTypeExtraViewAdapter extends RecyclerView.Adapter&ABRecyclerViewTypeExtraHolder& {
private static final int TYPE_HEADER_VIEW = 0x7683;
private View headerV
private static final int TYPE_FOOTER_VIEW = 0x7684;
private View footerV
private int extraC
protected ABRecyclerViewTypeExtraViewAdapter(View headerView, View footerView) {
this.headerView = headerV
this.footerView = footerV
extraCount += hasHeaderView() ? 0 : 1;
extraCount += hasFooterView() ? 0 : 1;
public boolean hasHeaderView() {
return null != headerV
public boolean hasFooterView() {
return null != footerV
public int innerPositionToRealItemPosition(int innerPosition) {
return hasHeaderView() ? innerPosition - 1 : innerP
@TargetApi(Build.VERSION_CODES.DONUT)
public ABRecyclerViewTypeExtraHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
ABAdapterTypeRender&ABRecyclerViewTypeExtraHolder& render = getAdapterTypeRender(viewType);
ABRecyclerViewTypeExtraHolder holder = render.getReusableComponent();
holder.itemView.setTag(R.id.ab__id_adapter_item_type_render, render);
render.fitEvents();
@TargetApi(Build.VERSION_CODES.DONUT)
public void onBindViewHolder(ABRecyclerViewTypeExtraHolder holder, int innerPosition) {
ABAdapterTypeRender&ABRecyclerViewTypeExtraHolder& render = (ABAdapterTypeRender&ABRecyclerViewTypeExtraHolder&) holder.itemView.getTag(R.id.ab__id_adapter_item_type_render);
* 计算该item在list中的index(不包括headerView和footerView)
int realItemPosition = innerPositionToRealItemPosition(innerPosition);
render.fitDatas(realItemPosition);
* 重新设置item在list中的index(不包括headerView和footerView)
holder.setRealItemPosition(realItemPosition);
* 通过类型获得对应的render(不包括headerView和footerView)
* @param type
public abstract ABAdapterTypeRender&ABRecyclerViewTypeExtraHolder& getAdapterTypeRenderExcludeExtraView(int type);
* 获取item的数量(不包括headerView和footerView)
public abstract int getItemCountExcludeExtraView();
* 通过realItemPosition得到该item的类型(不包括headerView和footerView)
* @param realItemPosition
public abstract int getItemViewTypeExcludeExtraView(int realItemPosition);
public ABAdapterTypeRender&ABRecyclerViewTypeExtraHolder& getAdapterTypeRender(int type) {
switch (type) {
case TYPE_HEADER_VIEW:
return new ABRecyclerViewTypeExtraRender(headerView);
case TYPE_FOOTER_VIEW:
return new ABRecyclerViewTypeExtraRender(footerView);
return getAdapterTypeRenderExcludeExtraView(type);
public int getItemCount() {
return getItemCountExcludeExtraView() + extraC
public int getItemViewType(int innerPosition) {
if (null != headerView && 0 == innerPosition) { // header
return TYPE_HEADER_VIEW;
} else if (null != footerView && getItemCount() - 1 == innerPosition) { // footer
return TYPE_FOOTER_VIEW;
return getItemViewTypeExcludeExtraView(innerPositionToRealItemPosition(innerPosition));
如上述代码所示:
因为我们的需求是需要添加&加载进度条&,所以需要像ListView那样,添加一个FooterView。可是坑爹的是,RecyclerView不提供addheaderView()和addFooterView()方法,所以只能我们自己去实现了,方法当然是使用不同type来区分类型。虽然headerView这里没有用到,但是也顺带实现下好了。
这里我们使用的Holder是,这个类待会分析。
headerView和footerView这里使用构造方法传入,并缓存headerView和footerView。在onCreateViewHolder中,我们通过不同type,生成相应的render。并把render绑定到holder的itemView上面,因为既然现在复用的是holder,那我的render也要实现复用的话,也绑定在holder里面吧。然后调用render的fitEvents方法,来实现render里面的事件绑定。
onBindViewHolder方法中,通过holder,取出render,然后注意Line49~54,里面执行了innerPositionToRealItemPosition()方法对innerPosition到RealItemPosition的转换,这里的innerPosition代表内部的position,因为这里可能会添加了headerView,一旦添加了headerView,那position跟数据源List中的index就不匹配了,这样的话绑定点击事件后,通过holder.getPositon()得到的position就不是index了,所以不能写&list.get(position)...&了。这里的realItemPosition就代表数据源对应的index 。所以我们要把innerPosition转换为realItemPosition,方法很简单,innerPosition-1=realItemPosition(这里的减去1实际上就是减去了headerView)。其实holder中本来就缓存了当前使用了这个holder的item的position,但是因为有了headerView的存在,position就不等于realItemPosition了,所以我们还需要缓存realItemPosition。所以代码Line46~54诞生了。
getItemCountExcludeExtraView()方法需要子类实现,返回数据源中的数据数量,然后再加上extraCount即是getItemCount的值。
getItemViewType()方法先执行了header类型和footer类型的逻辑,然后再让自类去实现getItemViewTypeExcludeExtraView()来执行其他类型的逻辑。
部分的实现可以查看
实现的原理大同小异了。
然后分析下()这个类,代码如下:
* Author: wangjie
* Email: tiantian.china.
* Date: 1/22/15.
6 public class ABRecyclerViewTypeExtraHolder extends ABRecyclerViewHolder {
public ABRecyclerViewTypeExtraHolder(View itemView) {
super(itemView);
* 保存当前position(list index,不包括headerView和footerView)
private int realItemP
public int getRealItemPosition() {
return realItemP
protected void setRealItemPosition(int realItemPosition) {
this.realItemPosition = realItemP
它继承了(),只是保存了一个刚刚讲到的realItemPosition对象。
所以我们再贴下的代码:
* Author: wangjie
* Email: tiantian.china.
* Date: 1/19/15.
6 public class ABRecyclerViewHolder extends RecyclerView.ViewHolder {
private static final String TAG = ABRecyclerViewHolder.class.getSimpleName();
private SparseArray&View& holder = null;
public ABRecyclerViewHolder(View itemView) {
super(itemView);
* 获取一个缓存的view
* @param id
* @param &T&
public &T extends View& T obtainView(int id) {
if (null == holder) {
holder = new SparseArray&&();
View view = holder.get(id);
if (null != view) {
return (T)
view = itemView.findViewById(id);
if (null == view) {
Logger.e(TAG, "no view that id is " + id);
return null;
holder.put(id, view);
return (T)
* 获取一个缓存的view,并自动转型
* @param id
* @param &T&
public &T& T obtainView(int id, Class&T& viewClazz) {
View view = obtainView(id);
if (null == view) {
return null;
return (T)
然后发现,它的作用是在于使用SparseArray来缓存findViewById后的控件。这样做的好处是,这个holder可以适用于任何的RecyclerView.Adapter中。只要通过obtainView()方法就能得到itemView中的具体的view对象,如下代码所示:
1 Person person = adapter.getList().get(position);
2 holder.obtainView(R.id.recycler_view_test_item_person_name_tv, TextView.class).setText(person.getName());=
3 holder.obtainView(R.id.recycler_view_test_item_person_age_tv, TextView.class).setText(person.getAge() + "岁");
示例代码:
阅读(...) 评论()| 漏洞检测 |
| 隐藏捆绑 |
Android新控件RecyclerView浅析及上拉和下拉刷新
概述: RecyclerView是android-support-v7-21版本中新增的一个Widgets,RecyclerView是ListView的升级版本,更加先进和灵活。在以后的开发中我们就可以直接使用RecyclerView来替换ListView。 特点介绍: 1. 可横向展示 2. 消除 错位问题 3. 标准化了ViewHolde
是android-support-v7-21版本中新增的一个Widgets,是ListView的升级版本,更加先进和灵活。在以后的开发中我们就可以直接使用RecyclerView来替换ListView。
特点介绍:
1. 可横向展示
2. 消除 &错位问题
3. 标准化了ViewHolder
private void initHorizaontal(List models) {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.activity_main_horizontal_recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, models);
recyclerView.setAdapter(adapter);
public void initVertical(List models) {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.activity_main_vertical_recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this, models);
recyclerView.setAdapter(adapter);
Adapter的变化:
Google在对RecyclerView的改进中还为我们解决了一个初学者比较头痛的问题:错位。
public class RecyclerViewAdapter extends RecyclerView.Adapter {
private List mList =
private Context mContext =
private LayoutInflater mInflater =
public RecyclerViewAdapter(Context context, List list) {
mContext =
mInflater = LayoutInflater.from(mContext);
public int getItemCount() {
if (mList != null) {
return mList.size();
public void onBindViewHolder(ViewHolder viewHolder, int position) {
((ItemViewHolder)viewHolder).mLabelTextView.setText(mList.get(position).getLabel());
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) {
View view = mInflater.inflate(R.layout.list_item, viewGroup, false);
ItemViewHolder holder = new ItemViewHolder(view);
holder.mLabelTextView = (TextView) view.findViewById(R.id.list_item_textview);
public static class ItemViewHolder extends ViewHolder{
public ItemViewHolder(View itemView) {
super(itemView);
private TextView mLabelTextView =
上拉或下拉刷新:
对于下拉刷新,自身有一个SwipeRefreshLayout已经有所实现。我们把SwipeRefreshLayout包在RecyclerView的外面,然后再设置其绑定到一个OnRefreshListener上。
public void onRefresh() {
handler.sendEmptyMessageDelayed(0, 3000);
而对于上拉刷新,我们则是自定义一个FooterView和线程来进行的。
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
public void onScrollStateChanged(RecyclerView recyclerView,
int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == adapter.getItemCount()) {
handler.sendEmptyMessageDelayed(1, 3000);
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
(责任编辑:幽灵学院)
------分隔线----------------------------
场长挪用千万公款赴(澳门赌博网站) 坚信小赌怡情,大赌伤身 中国江西网讯 王倩、记...
最近携程开源了一套动态加载的框架,总的来说,该框架和OpenAtlas还是有一定的相似之...
apktool 反编译APK 使用apktool d ,默认会生成和APK文件名同名的文件夹,里面会存放反...
话说一个乞丐在看一个程序员写程序,程序员遇到一个问题怎么都解决不了,这时乞丐说这...
本节引言: 最近一段时间因为工作上的事以及面试等等,耽误了博客的更新,这里道歉下~...
美团的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull to refresh),在这个状...
admin@1744.cc
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院
广告服务:QQ:

我要回帖

更多关于 recyclerview 的文章

 

随机推荐