您的位置:首页 > 其它

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控件

<?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);
}

}


结果:略
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: