SwipeRefreshLayout 是谷歌公司推出的用于下拉刷新的控件,
SwipeRefreshLayout已经被放到了sdk中,在Version 19.1之后SwipeRefreshLayout 被放到support v4中。
源码在
SDK\sdk\extras\android\support\v4\src\java\android\support\v4\widget\
SwipeRefreshLayout.java
谷歌公司只提供了下拉刷新的功能,RecyclerView的出现基本就是为了替代ListView,GridView的。
今天说一下最常见的下拉刷新 和 上拉刷新的功能。本文适合初学者来步了初解新特性
下拉利用Google的 SwipeRefreshLayout 上拉 利用RecyclerView,来调用SwipeRefreshLayoutpublic class MainActivity extends FragmentActivity {
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@SuppressLint("NewApi")
@Override
public void onClick(View v) {
//R.id.frameLayout, new MyListFragment()
getFragmentManager().beginTransaction().replace(R.id.frameLayout, new RecyleViewFragment()).commit();
}
});
}
}
fragment
package com.lmz.love.coolo2o.common.acitivty.main;
@SuppressLint("NewApi")
public class RecyleViewFragment extends Fragment {
@SuppressLint("NewApi")
private SwipeRefreshLayout swipeRefreshLayout;
private RecyclerView listView;
private List<String> data;
private RecycleViewAdapter adapter;
private LinearLayoutManager mLayoutManager;
private int lastVisibleItem;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment__recyclepictext, container, false);
init(v);
return v;
}
private void init(View v) {
listView = (RecyclerView) v.findViewById(R.id.recyclerview);
data = new ArrayList<String>();
for (int i = 0; i < 50; i++) {
data.add("我是测试item:" + i);
}
mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
listView.setLayoutManager(mLayoutManager);
adapter = new RecycleViewAdapter(getActivity() ,data);
listView.setAdapter(adapter);
//findview
swipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipeRefreshLayout);
//设置卷内的颜色
swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light,android.R.color.holo_purple);
//设置下拉刷新监听
swipeRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
public void run() {
data.add(0, "添加新的item" + new Random().nextInt());
adapter.notifyDataSetChanged();
//停止刷新动画
swipeRefreshLayout.setRefreshing(false);
}
}, 5000);
}
});
listView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(int arg0, int arg1) {
当滑到最后一个条目的位置
lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
}
@Override
public void onScrollStateChanged(int newState) {
// TODO Auto-generated method stub
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 1 == adapter.getItemCount()) {
swipeRefreshLayout.setRefreshing(true);
new Handler().postDelayed(new Runnable() {
public void run() {
data.add(adapter.getItemCount()-1, "添加新的item" + new Random().nextInt());
adapter.notifyDataSetChanged();
//停止刷新动画
swipeRefreshLayout.setRefreshing(false);
}
}, 5000);
}
}}
);
}
}
RecycleViewAdapter
package com.lmz.love.coolo2o.common.adapter;
import java.util.List;
import com.lmz.love.coolo2o.R;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class RecycleViewAdapter extends RecyclerView.Adapter<ViewHolder>{
private List<String> list;
private static int FOOT_ITEM=0x11 ;
private static int OBJECT_ITEM= 0X12 ;
private LayoutInflater inflater;
public RecycleViewAdapter(Context mContext , List<String> data){
inflater = LayoutInflater.from(mContext);
this.list = data;
}
// RecyclerView的count设置为数据总条数+ 1(footerView)
@Override
public int getItemCount() {
// TODO Auto-generated method stub
return list.size()+1; //让条目的数量增加一个
}
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
if( position+1 == getItemCount())
return FOOT_ITEM; //当最后一个,就是底部布局
else
return OBJECT_ITEM;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
// TODO Auto-generated method stub
if (viewHolder instanceof ItemViewHolder) {
ItemViewHolder new_name = (ItemViewHolder) viewHolder;
new_name.tv.setText("嘿嘿:"+list.get(position));
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// TODO Auto-generated method stub
if(viewType == OBJECT_ITEM ){
//这个需要注意 inflate方法的第二个参数一定要写viewGroup,不然item的宽度是固定的。并不等于屏幕宽度
View view =inflater.inflate(R.layout.list_item_text, parent,false);
ItemViewHolder viewHolder = new ItemViewHolder(view);
viewHolder.tv = (TextView) view.findViewById(R.id.tv); 我用了两种不同的方式来绑定布局。原理上都是一样的 一种是提前赋值,一种是后赋值
return viewHolder;
}else if(viewType == FOOT_ITEM ){
View view =inflater.inflate(R.layout.foot_item_text, parent,false);
return new FooterViewHolder(view);
}
return null;
}
public class ItemViewHolder extends ViewHolder{
private TextView tv;
public ItemViewHolder(View itemView) {
super(itemView);
}
}
class FooterViewHolder extends ViewHolder {
private TextView tv_foot;
public FooterViewHolder(View view) {
super(view);
tv_foot = (TextView) view.findViewById(R.id.foot_tv);
}
}
}
下载资源
http://download.csdn.net/detail/lggisking/9483802