Android5.x之RecyclerView使用(4)上下拉刷新

来源:互联网 发布:淘宝信誉度怎么说 编辑:程序博客网 时间:2024/04/27 16:52

在ListView的时代,上下拉刷新可以给ListView添加一个头布局和尾布局来实现,通过对滑动动作进行动态监测,实现页面刷新的效果
像主流的第三方的XListView和PullToListView都是通过这样的方式来实现的上下拉的刷新效果,最近我注意到像内涵段子和知乎这两个app使用了一种新的刷新效果,一查才知道他们是使用了Google新推出的一个控件SwipeRefreshLayout来实现的下拉刷新效果,因为此控件内部只允许添加一个子View,所以我们可以在其中加入一个ListView或者(RecyclerView)或者一个Layout来实现下拉刷新的效果
至于上拉加载 ,可以在适配器中动态判断

拿到可见的最后一个条目int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
package com.longyue.recyclerviewreflesh3;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import butterknife.ButterKnife;import butterknife.InjectView;/** * @author Leo */public class MainActivity extends AppCompatActivity {    @InjectView(R.id.toolbar)    Toolbar toolbar;    @InjectView(R.id.recyclerView)    RecyclerView recyclerView;    @InjectView(R.id.SwipeRefreshLayout)    SwipeRefreshLayout swipeRefreshLayout;    boolean isLoading;    private List<Map<String, Object>> data = new ArrayList<>();    private RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, data);    private Handler handler = new Handler();    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_notice);        ButterKnife.inject(this);        initView();        initData();    }    public void initView() {        setSupportActionBar(toolbar);        toolbar.setTitle(R.string.notice);        toolbar.setNavigationOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                finish();            }        });        swipeRefreshLayout.setColorSchemeResources(R.color.blueStatus);        swipeRefreshLayout.post(new Runnable() {            @Override            public void run() {                swipeRefreshLayout.setRefreshing(true);            }        });        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                handler.postDelayed(new Runnable() {                    @Override                    public void run() {                        data.clear();                        getData();                    }                }, 2000);            }        });        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);        recyclerView.setLayoutManager(layoutManager);        recyclerView.setAdapter(adapter);        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {            @Override            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {                super.onScrollStateChanged(recyclerView, newState);                Log.d("test", "StateChanged = " + newState);            }            @Override            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                super.onScrolled(recyclerView, dx, dy);                Log.d("test", "onScrolled");                int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();                if (lastVisibleItemPosition + 1 == adapter.getItemCount()) {                    Log.d("test", "loading executed");                    boolean isRefreshing = swipeRefreshLayout.isRefreshing();                    if (isRefreshing) {                        adapter.notifyItemRemoved(adapter.getItemCount());                        return;                    }                    if (!isLoading) {                        isLoading = true;                        handler.postDelayed(new Runnable() {                            @Override                            public void run() {                                getData();                                Log.d("test", "load more completed");                                isLoading = false;                            }                        }, 1000);                    }                }            }        });        //添加点击事件        adapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Log.d("test", "item position = " + position);            }            @Override            public void onItemLongClick(View view, int position) {            }        });    }    public void initData() {        handler.postDelayed(new Runnable() {            @Override            public void run() {                getData();            }        }, 1500);    }    /**     * 获取测试数据     */    private void getData() {        for (int i = 0; i < 6; i++) {            Map<String, Object> map = new HashMap<>();            data.add(map);        }        adapter.notifyDataSetChanged();        swipeRefreshLayout.setRefreshing(false);        adapter.notifyItemRemoved(adapter.getItemCount());    }}
package com.longyue.recyclerviewreflesh3;import android.content.Context;import android.support.v7.widget.RecyclerView.Adapter;import android.support.v7.widget.RecyclerView.ViewHolder;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;import java.util.List;public class RecyclerViewAdapter extends Adapter<ViewHolder> {    private static final int TYPE_ITEM = 0;    private static final int TYPE_FOOTER = 1;    private Context context;    private List data;    public RecyclerViewAdapter(Context context, List data) {        this.context = context;        this.data = data;    }    public interface OnItemClickListener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    private OnItemClickListener onItemClickListener;    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {        this.onItemClickListener = onItemClickListener;    }    @Override    public int getItemCount() {        return data.size() == 0 ? 0 : data.size() + 1;    }    @Override    public int getItemViewType(int position) {        if (position + 1 == getItemCount()) {            return TYPE_FOOTER;        } else {            return TYPE_ITEM;        }    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TYPE_ITEM) {            View view = LayoutInflater.from(context).inflate(R.layout.item_base, parent,                    false);            return new ItemViewHolder(view);        } else if (viewType == TYPE_FOOTER) {            View view = LayoutInflater.from(context).inflate(R.layout.item_foot, parent,                    false);            return new FootViewHolder(view);        }        return null;    }    @Override    public void onBindViewHolder(final ViewHolder holder, int position) {        if (holder instanceof ItemViewHolder) {            //holder.tv.setText(data.get(position));            if (onItemClickListener != null) {                holder.itemView.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        int position = holder.getLayoutPosition();                        onItemClickListener.onItemClick(holder.itemView, position);                    }                });                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                    @Override                    public boolean onLongClick(View v) {                        int position = holder.getLayoutPosition();                        onItemClickListener.onItemLongClick(holder.itemView, position);                        return false;                    }                });            }        }    }    static class ItemViewHolder extends ViewHolder {        TextView tv;        public ItemViewHolder(View view) {            super(view);            tv = (TextView) view.findViewById(R.id.tv_date);        }    }    static class FootViewHolder extends ViewHolder {        public FootViewHolder(View view) {            super(view);        }    }}

Demo下载

0 0
原创粉丝点击