SwipeRefreshLayout(下拉刷新)与RecyclerView之简单使用<一>
2017-03-01 20:57
483 查看
转发请注明出处:http://blog.csdn.net/qq_28055429/article/details/59117869
一,SwipeRefreshLayout
1,简意:SwipeRefreshLayout是V4支持包中提供的一个新的控件,它可以实现下拉刷新的功能。但是缺点是没有实现上拉加载更多。但是网上有很多开发者对它进行加强,使得它可以实现上拉加载。
2,优点:可以包裹一个任何可以滚动的内容(ListView GridView ScrollView RecyclerView),可以自动识别垂直滚动手势。使用起来非常方便
3,用法:
(1)将需要下拉刷新的空间包裹起来
(2)设置刷新动画的触发回调
4,例子:
例子1:用SwipeRefreshLayout+ListView
布局:activity_test.xml----定义一个SwipeRefreshLayout和嵌套一个ListView控件
TestActivity中:
(1)先像listView使用一样,创建适配器并添加数据,然后为listView绑定适配器
(2)设置SwipeRefreshLayout
效果:
下拉前与下拉后,
二,RecyclerView:
1,简意:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式
2,用途:被用在有限的窗口中展示大量数据集,被作为ListView和GridView控件的继承者
3,优点:提供了一种插拔式的体验,高度的解耦,异常的灵魂,可设置不同LayoutManager(显示方式),ItemAnimator(Item动画),ItemDecoration(Item间隔)等
4,基本使用步骤:
(1)在gradle中引入依赖库:如
compile 'com.android.support:recyclerview-v7:23.1.1'
(2)直接在布局中当控件使用:
这里在创建一个item.xml布局,存放一个textView标签,用于后面创建适配器时显示使用:
(3)创建适配器类继承RecycleView的Adapter,步骤为:
(1)继承RecyclerView.Adapter,并且在Adapter里面声明ViewHolder类继承RecyclerView.ViewHolder,最后把自己的ViewHolder类丢进自己的Adapter类的泛型中去。
(2)在自定义ViewHolder类的构造方法中可以通过ID找到布局的控件,控件需要声明为自定义ViewHolder类的成员变量。
(3)实现RecyclerView.Adapter的所有未实现的函数,onCreateViewHolder主要负责加载布局(加载的时候注意要把父布局写到参数里去),创建自定义ViewHolder类的对象;onBindViewHolder主要负责把数据设置到Item的控件中;getItemCount主要负责得到数据的数目。
(4) 最好把数据声明为成员变量,在构造函数里面传进来。
(5)由于RecycleView原生不支持点击事件,需要自己添加接口进行回调。
代码:MyAdapter
接下来主要在主代码MainActivity中调用即可:
list中的数据:
其它略,,,
三,综合一和二,用SwipeRefreshLayout+RecyclerView举个例子:
布局:两个:activity_test.xml和item.xml
activity_test.xml放置SwipeRefreshLayout,内嵌RecyclerView
item.xml:放置一个textView标签,用于适配器初始化使用,与二中的例子一样
创建RecyclerView的适配器,与二中的例子代码一样
TestActivity中代码如下:
结果:略
一,SwipeRefreshLayout
1,简意:SwipeRefreshLayout是V4支持包中提供的一个新的控件,它可以实现下拉刷新的功能。但是缺点是没有实现上拉加载更多。但是网上有很多开发者对它进行加强,使得它可以实现上拉加载。
2,优点:可以包裹一个任何可以滚动的内容(ListView GridView ScrollView RecyclerView),可以自动识别垂直滚动手势。使用起来非常方便
3,用法:
(1)将需要下拉刷新的空间包裹起来
(2)设置刷新动画的触发回调
4,例子:
例子1:用SwipeRefreshLayout+ListView
布局:activity_test.xml----定义一个SwipeRefreshLayout和嵌套一个ListView控件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/recycleView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
TestActivity中:
(1)先像listView使用一样,创建适配器并添加数据,然后为listView绑定适配器
(2)设置SwipeRefreshLayout
public class TestActivity extends AppCompatActivity { private SwipeRefreshLayout swipeRefreshLayout ; //定义SwipeRefreshLayout private ListView listView ; //定义ListView控件 private List<String> list = new ArrayList<>(); //定义List<String>集合 //private RecyclerView.Adapter adapter ; private ArrayAdapter adapter ; //定义ArrayAdapter对象 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); initView(); //初始化对象 initDatas(); //初始化数据 } /* 初始化对象 */ private void initView() { //为各个控件绑定id swipeRefreshLayout = (SwipeRefreshLayout)this.findViewById(R.id.refreshLayout); listView = (ListView) this.findViewById(R.id.recycleView); } /* 初始化数据 */ private void initDatas() { //初始化适配器,这里为字符串类型 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,getData() ); //为listView绑定适配器 listView.setAdapter(adapter); //设置进度条的颜色,不定长参数可以设置多种颜色 //对于RefreshLayout,网上有人说最多4种颜色,不要使用android.R.color.,否则会卡死 swipeRefreshLayout.setColorSchemeColors( Color.YELLOW, Color.RED, Color.GREEN); //设置进度条的背景颜色 swipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.WHITE); //设置大小 swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); //设置手指划过多少像素开始触发刷新 swipeRefreshLayout.setDistanceToTriggerSync(100); //设置下拉刷新监听 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //新开线程来执行 new Handler().postDelayed(new Runnable() { @Override public void run() { //下拉刷新的处理 refreshData(); //结束后停止刷新 swipeRefreshLayout.setRefreshing(false); //关闭下拉刷新 swipeRefreshLayout.setRefreshing(false); } } , 300); } }); } /* 为list集合添加数据 */ private List<String> getData() { list.add("years"); list.add("months"); list.add("days"); list.add("hours"); return list ; } /** * 下拉刷新处理 */ private void refreshData() { //这里添加10条新的数据 for(int i = 0 ; i < 10 ; i++){ list.add(0 , "second : " + i); } //适配器设置更新 adapter.notifyDataSetChanged(); } }
效果:
下拉前与下拉后,
二,RecyclerView:
1,简意:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式
2,用途:被用在有限的窗口中展示大量数据集,被作为ListView和GridView控件的继承者
3,优点:提供了一种插拔式的体验,高度的解耦,异常的灵魂,可设置不同LayoutManager(显示方式),ItemAnimator(Item动画),ItemDecoration(Item间隔)等
4,基本使用步骤:
(1)在gradle中引入依赖库:如
compile 'com.android.support:recyclerview-v7:23.1.1'
(2)直接在布局中当控件使用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
这里在创建一个item.xml布局,存放一个textView标签,用于后面创建适配器时显示使用:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/icon_back_32px" android:gravity="center" android:padding="20dp" > <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_gravity="center" android:layout_height="wrap_content" android:gravity="center" android:textColor="#000" android:textSize="20dp" android:padding="20dp" android:text="1" /> </LinearLayout>
(3)创建适配器类继承RecycleView的Adapter,步骤为:
(1)继承RecyclerView.Adapter,并且在Adapter里面声明ViewHolder类继承RecyclerView.ViewHolder,最后把自己的ViewHolder类丢进自己的Adapter类的泛型中去。
(2)在自定义ViewHolder类的构造方法中可以通过ID找到布局的控件,控件需要声明为自定义ViewHolder类的成员变量。
(3)实现RecyclerView.Adapter的所有未实现的函数,onCreateViewHolder主要负责加载布局(加载的时候注意要把父布局写到参数里去),创建自定义ViewHolder类的对象;onBindViewHolder主要负责把数据设置到Item的控件中;getItemCount主要负责得到数据的数目。
(4) 最好把数据声明为成员变量,在构造函数里面传进来。
(5)由于RecycleView原生不支持点击事件,需要自己添加接口进行回调。
代码:MyAdapter
//(1)继承RecyclerView.Adapter,并且在Adapter里面声明ViewHolder类继承RecyclerView.ViewHolder, // 最后把自己的ViewHolder类丢进自己的Adapter类的泛型中去。 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mDatas; //list集合 private LayoutInflater inflater; //用于加载布局 private OnItemClickListener listener; //自定义接口 /* (5)由于RecycleView原生不支持点击事件,需要自己添加接口进行回调。 */ public void setOnItemClickListener(OnItemClickListener listener){ this.listener = listener; } /* (4)最好把数据声明为成员变量,在构造函数里面传进来。 */ public MyAdapter(List<String> datas){ mDatas = datas; } /** (3)实现RecyclerView.Adapter的所有未实现的函数, onCreateViewHolder主要负责加载布局(加载的时候注意要把父布局写到参数里去), 创建自定义ViewHolder类的对象; */ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { inflater = LayoutInflater.from(parent.getContext()); View view = inflater.inflate(R.layout.item,parent,false); return new ViewHolder(view); } /* (3)onBindViewHolder主要负责把数据设置到Item的控件中 */ @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.textView.setText(mDatas.get(position)); } /* (3)getItemCount主要负责得到数据的数目 */ @Override public int getItemCount() { return mDatas.size(); } /* 为list添加数据 */ public void addData(int position,String city){ mDatas.add(position,city); notifyItemInserted(position); } /* 为list删除数据 */ public void removeData(int position){ mDatas.remove(position); notifyItemRemoved(position); } public void notifyItemsChange(int start,int itemCount){ notifyItemRangeChanged(start,itemCount); } /** * (1)声明ViewHolder类继承RecyclerView.ViewHolder * (2)在自定义ViewHolder类的构造方法中可以通过ID找到布局的控件, * 控件需要声明为自定义ViewHolder类的成员变量。 */ class ViewHolder extends RecyclerView.ViewHolder{ private TextView textView; //定义item中的textView //初始化 public ViewHolder(View itemView) { super(itemView); //绑定控件 textView = (TextView) itemView.findViewById(R.id.text); //设置监听 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(listener !=null){ listener.onClick(v,getLayoutPosition(),mDatas.get(getLayoutPosition())); } } }); } } /* (5)由于RecycleView原生不支持点击事件,需要自己添加接口进行回调。 */ public interface OnItemClickListener{ void onClick(View v, int position, String city); } }
接下来主要在主代码MainActivity中调用即可:
recyclerView = (RecyclerView) findViewById(R.id.recycle); //设置RecycleView的适配器 adapter = new MyAdapter(datas); recyclerView.setAdapter(adapter); //设置布局管理器,以渲染出不同的效果 recyclerView.setLayoutManager(new LinearLayoutManager(this)); //设置插入、删除数据的动画效果(这里使用默认的动画) recyclerView.setItemAnimator(new DefaultItemAnimator()); //设置条目监听,需要自定义接口 adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onItemClick(View v, int position, String data) { Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show(); } });
list中的数据:
list = new ArrayList<>(); for (int i = 0; i < 300; i++) { list.add(i + ""); }
其它略,,,
三,综合一和二,用SwipeRefreshLayout+RecyclerView举个例子:
布局:两个:activity_test.xml和item.xml
activity_test.xml放置SwipeRefreshLayout,内嵌RecyclerView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/refreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:layout_width="match_parent" android:layout_height="wrap_content"/> </android.support.v4.widget.SwipeRefreshLayout> </LinearLayout>
item.xml:放置一个textView标签,用于适配器初始化使用,与二中的例子一样
创建RecyclerView的适配器,与二中的例子代码一样
TestActivity中代码如下:
public class TestActivity extends AppCompatActivity { private SwipeRefreshLayout swipeRefreshLayout ; //定义SwipeRefreshLayout private RecyclerView mRecyclerView; //定义RecyclerView private List<String> list = new ArrayList<>(); //定义List<String>集合 private MyAdapter adapter ; //定义MyAdapter对象 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); initView(); //初始化对象 addListDatas(); //为List<String>集合初始化数据 initDatas(); //初始化数据 } /* 初始化对象 */ private void initView() { //为各个控件绑定id swipeRefreshLayout = (SwipeRefreshLayout)this.findViewById(R.id.refreshLayout); mRecyclerView = (RecyclerView)this.findViewById(R.id.recycleView); } /* 为List<String>集合初始化数据 */ private void addListDatas(){ list.add("Years"); list.add("Months"); list.add("Days"); list.add("Hours"); } /* 初始化数据 */ private void initDatas() { //初始化适配器 adapter = new MyAdapter(list); //为RecyclerView绑定适配器 mRecyclerView.setAdapter(adapter); // mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() { @Override public void onClick(View v, int position, String city) { Toast.makeText(TestActivity.this, "city:" + city + ",position:" + position, Toast.LENGTH_LONG).show(); } }); //设置进度条的颜色,不定长参数可以设置多种颜色 //对于RefreshLayout,网上有人说最多4种颜色,不要使用android.R.color.,否则会卡死 swipeRefreshLayout.setColorSchemeColors( Color.YELLOW, Color.RED, Color.GREEN); //设置进度条的背景颜色 swipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.WHITE); //设置大小 swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); //设置手指划过多少像素开始触发刷新 swipeRefreshLayout.setDistanceToTriggerSync(100); //设置下拉刷新监听 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //新开线程来执行 new Handler().postDelayed(new Runnable() { @Override public void run() { //下拉刷新的处理 //refreshData(); refreshData2(); //结束后停止刷新 swipeRefreshLayout.setRefreshing(false); //关闭下拉刷新 swipeRefreshLayout.setRefreshing(false); } } , 300); } }); } private void refreshData2() { for(int i = 0; i < 10 ; i++){ adapter.addData(i , "second: " + i); } adapter.notifyItemRangeChanged(0 , 10); mRecyclerView.scrollToPosition(3); } }
结果:略
相关文章推荐
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- RecyclerView下拉刷新、上拉加载框架<一>
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- GCD的简单使用<一>
- <SearchView > 搜索框的简单使用
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- 一款下拉刷新以及上拉加载的控件库,扩展性强,使用简单。并附带有可以添加 header 和 footer 的 Recyclerview
- RecyclerView的简单使用,实现下拉刷新、上拉加载
- android中RecyclerView的简单使用(四)——上下拉刷新的实现
- <mvc:view-controller path="" view-name=""/>这个的具体使用
- 在Android Studio上使用GSON+VOLLEY,秒处理网络数据成集合。感受框架的力量。搭配RecyclerView和SwipeRefreshLayout,实现底端加载更多,下拉刷新。
- Android RecyclerView 的简单使用
- Android-->FlowRadioGroup(流式布局RadioGroup, 自定义View的简单使用)
- Webview响应简单的<input type="submit" value="Submit">
- <errno.h>的简单使用
- RecyclerView 的简单使用
- RecyclerView的基本使用,还有SwipeRefreshLayout(原生的下拉刷新)(1)
- Android新特性之RecyclerView的简单使用
- recyclerview的简单使用