Android新控件RecyclerView浅析及上拉和下拉刷新

概述:

RecyclerView是android-support-v7-21版本中新增的一个Widgets,RecyclerView是ListView的升级版本,更加先进和灵活。在以后的开发中我们就可以直接使用RecyclerView来替换ListView。

特点介绍:

1. 可横向展示

2. 消除错位问题

3. 标准化了ViewHolder

横向:

private void initHorizaontal(List<ItemModel> 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<ItemModel> 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<ViewHolder> {

	private List<ItemModel> mList = null;

	private Context mContext = null;

	private LayoutInflater mInflater = null;

	public RecyclerViewAdapter(Context context, List<ItemModel> list) {
		mContext = context;
		mList = list;
		mInflater = LayoutInflater.from(mContext);
	}

	@Override
	public int getItemCount() {
		if (mList != null) {
			return mList.size();
		}
		return 0;
	}

	@Override
	public void onBindViewHolder(ViewHolder viewHolder, int position) {
		((ItemViewHolder)viewHolder).mLabelTextView.setText(mList.get(position).getLabel());
	}

	@Override
	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);

		return holder;
	}

	public static class ItemViewHolder extends ViewHolder{

        public ItemViewHolder(View itemView) {
            super(itemView);
        }

        private TextView mLabelTextView = null;
    }
}

上拉或下拉刷新:

对于下拉刷新,Android自身有一个控件SwipeRefreshLayout已经有所实现。我们把SwipeRefreshLayout包在RecyclerView的外面,然后再设置其绑定到一个OnRefreshListener上。

布局:

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/swipe_refresh_widget"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v7.widget.RecyclerView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="@null"
        android:scrollbars="vertical" />

</android.support.v4.widget.SwipeRefreshLayout>

监听:

@Override
    public void onRefresh() {
        handler.sendEmptyMessageDelayed(0, 3000);
    }

而对于上拉刷新,我们则是自定义一个FooterView和线程来进行的。

mRecyclerView.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()) {
                    handler.sendEmptyMessageDelayed(1, 3000);
                }
            }

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

        });

相关源码下载:

RecyclerView初步使用

RecyclerView的上拉和下拉刷新

时间: 2024-10-13 16:55:35

Android新控件RecyclerView浅析及上拉和下拉刷新的相关文章

Android新控件RecyclerView剖析

传智·没羽箭(传智播客北京校区Java学院高级讲师) 个人简介:APKBUS专家之一,黑马技术沙龙会长,在移动领域有多年的实际开发和研究经验,精通HTML5.Oracle.J2EE .Java Web编程.对Android应用开发与平台开发有较深入研究.从基础到高级的课程中,授课风格深受学员的喜爱. Android L版本中新增了RecyclerView,用于显示复杂视图的新增Widget. 一.RecyclerView 替代ListView的RecyclerView使ViewHolder标准化

Android 新控件RecyclerView

RecyclerView 是 android-support-v7-21 版本中新增的一个 Widgets.我们可以使用RecyclerView非常简单的实现横向竖向的ListView.GridView.以及瀑布流的效果.先看一下项目的实现的效果 是不是很炫?使用RecyclerView可以非常简单的实现. RecyclerView 特性 1.不关心Item是否显示在正确的位置以及如何显示 2.不关心item之间如何分割 3.不关注Item增加与删除的动画效果 4.它仅仅只是关注如何回收和复用i

android L新控件RecyclerView详解与DeMo

介绍 在谷歌的官网我们可以看到它是这样介绍的:RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with eleme

新控件RecyclerVIew的介绍和兼容使用的方法

RecyclerVIew是一个可以替代listview和Gallery的有效空间而且在support-v7中有了低版本支持,具体使用方式还是规规矩矩的适配器加控件模式.我们先来看看官网的介绍: 介绍 RecyclerView  is a more advanced and flexible version of  ListView . This widget is a container for large sets of views that can be recycled and scrol

Android基础控件——RecyclerView实现拖拽排序侧滑删除效果

RecyclerView实现拖拽排序侧滑删除效果 事先说明: RecyclerView是ListView的升级版,使用起来比ListView更规范,而且功能和动画可以自己添加,极容易扩展,同样也继承了ListView复用convertView和ViewHolder的优点.   思路分析: 1.导包.在布局中使用RecyclerView 2.需要一个JavaBean用来存储展示信息 3.需要一个填充RecyclerView的布局文件 4.在代码中找到RecyclerView,并为其绑定Adapte

android 新控件 AppBarLayout 使用

AppBarLayout 是继承LinerLayout实现的一个ViewGroup容器组件,它是为了Material Design设计的App Bar,支持手势滑动操作. 默认的AppBarLayout是垂直方向的,它的作用是把AppBarLayout包裹的内容都作为AppBar.代码布局如下: <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width=&qu

转:zTree树控件实战篇:针对多个下拉加载zTree树应该如何做出合理的配置

今天有一个zTree的朋友遇到一个非常棘手的问题,才研究zTree树控件两天就被上头催着看成果,很是苦恼.他面对的问题就是页面内多个地方需要下拉在其文本框下方加载zTree树,由于对zTree下拉加载树的一些关键配置以及原理的不太深入导致问题无从查起.今天就来一起聊聊这样一个下拉加载zTree的问题. 一.几个关键的配置需要注意 1.针对不同的下拉选择需要有自己独立控制zTree显示位置以及隐藏相应标签的方法: 2.需要根据所点击事件定位zTree的显示位置: 3.zTree树选择后需要加以判断

Bootstrap 表单控件一(单行输入框input,下拉选择框select ,文本域textarea)

单行输入框,常见的文本输入框,也就是input的type属性值为text.在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确的样式,因为Bootstrap框架都是通过input[type=“?”](其中?号代表type类型,比如说text类型,对应的是input[type=“text”])的形式来定义样式的. 为了让控件在各种表单风格中样式不出错,需要添加类名“form-control”,如: <form role="form"

自定义下拉控件,点击屏幕别处收起下拉

/// <summary> /// 在调度消息之前将其筛选出来. /// </summary> /// <param name="m">要调度的消息.无法修改此消息.</param> /// <returns>如果筛选消息并禁止消息被调度,则为 true:如果允许消息继续到达下一个筛选器或控件,则为 false.</returns> public bool PreFilterMessage(ref Message