Google自己的下拉刷新组件 SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新

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,来调用SwipeRefreshLayout 

public 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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值