RecyclerView的使用以及下拉刷新自动加载(添加点击事件、头部)

来源:互联网 发布:xilinx mac 编辑:程序博客网 时间:2024/05/02 02:46

RecyclerView的使用完全解析:http://blog.csdn.net/lmj623565791/article/details/45059587;(鸿洋大神) 

参照鸿洋大神写的一个demo,并给它加上了点击与长按事件以及添加头部布局:

我们都知道recyclerview没有自带上拉刷新的方法,所以用addOnScrollListener给它添加自动加载


  /**上拉加载*/        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);//        layoutManager.scrollToPosition(postion);        mRecyclerView.setLayoutManager(layoutManager);        mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(layoutManager) {            @Override            public void onLoadMore(int currentPage) {                swipeRefresh = false;//               写加载过程 initData();            }        });

自动加载接口

import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;/** * Created by Administrator on 2016/11/15. */public abstract class EndlessRecyclerOnScrollListener extends        RecyclerView.OnScrollListener {    private int previousTotal = 0;    private boolean loading = true;    int firstVisibleItem, visibleItemCount, totalItemCount;    private int currentPage = 1;    private LinearLayoutManager mLinearLayoutManager;    public EndlessRecyclerOnScrollListener(            LinearLayoutManager linearLayoutManager) {        this.mLinearLayoutManager = linearLayoutManager;    }    @Override    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {        super.onScrolled(recyclerView, dx, dy);        visibleItemCount = recyclerView.getChildCount();        totalItemCount = mLinearLayoutManager.getItemCount();        firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();        if (loading) {            if (totalItemCount > previousTotal) {                loading = false;                previousTotal = totalItemCount;            }        }        if (!loading                && (totalItemCount - visibleItemCount) <= firstVisibleItem) {            currentPage++;            onLoadMore(currentPage);            loading = true;        }    }    public abstract void onLoadMore(int currentPage);}

然后就是正常使用了


public class HomepageAdapter extends RecyclerView.Adapter<HomepageAdapter.MyViewHolder> {    public interface OnItemClickLitener {        void onItemClick(View view, int position);        void onItemLongClick(View view, int position);    }    public static final int TYPE_HEADER = 0;//没有头部布局    public static final int TYPE_NORMAL = 1;//有一个头部布局    public View mHeaderView;    public List<Bean.ResultBean.DataBean> mDatas;    public OnItemClickLitener mOnItemClickLitener;    public Context context;    public HomepageAdapter(Context context, List<Bean.ResultBean.DataBean> mDatas) {        this.context = context;        this.mDatas = mDatas;    }    public void setHeaderView(View headerView) {        mHeaderView = headerView;        notifyItemInserted(0);    }    public void addDatas(List<Bean.ResultBean.DataBean> datas) {        mDatas.addAll(datas);        notifyDataSetChanged();    }    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {        this.mOnItemClickLitener = mOnItemClickLitener;    }    @Override    public int getItemViewType(int position) {        if (mHeaderView == null) return TYPE_NORMAL;        if (position == 0) return TYPE_HEADER;        return TYPE_NORMAL;    }    public int getRealPosition(RecyclerView.ViewHolder holder) {        int position = holder.getLayoutPosition();        return mHeaderView == null ? position : position - 1;    }    @Override    public void onBindViewHolder(final MyViewHolder holder, final int position) {        if (getItemViewType(position) == TYPE_HEADER) return;        final int pos = getRealPosition(holder);        Bean.ResultBean.DataBean bean = mDatas.get(pos);        Picasso.with(context).load(bean.getThumbnail_pic_s()).placeholder(R.drawable.iv_loading).error(android.R.drawable.stat_notify_error).into(holder.ivheader);        holder.tvtitle.setText(bean.getTitle());        holder.tvresuce.setText(bean.getRealtype());        holder.mtime.setText(bean.getDate());        // 如果设置了回调,则设置点击事件        if (mOnItemClickLitener != null) {            holder.itemView.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    int pos = holder.getLayoutPosition();                    mOnItemClickLitener.onItemClick(holder.itemView, pos);                }            });            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {                @Override                public boolean onLongClick(View v) {                    int pos = holder.getLayoutPosition();                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);                    return false;                }            });        }    }    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (mHeaderView != null && viewType == TYPE_HEADER)            return new MyViewHolder(mHeaderView);        View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.homepage_item, parent, false);        return new MyViewHolder(layout);    }    @Override    public int getItemCount() {        return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;    }    class MyViewHolder extends RecyclerView.ViewHolder {        ImageView ivheader;        TextView tvtitle, tvresuce, mtime;        public MyViewHolder(View view) {            super(view);            ivheader = (ImageView) view.findViewById(R.id.iv_list);            tvtitle = (TextView) view.findViewById(R.id.tv_title);            tvresuce = (TextView) view.findViewById(R.id.tv_body);            mtime = (TextView) view.findViewById(R.id.tv_time);        }    }}
在Fragment中的使用

public class HomePageFragment extends Fragment {    private RecyclerView mRecyclerView;    private List<Bean.ResultBean.DataBean> mDatas;    private HomepageAdapter mAdapter;    private Bean bean;    private RequestQueue queue;    public static HomePageFragment newInstance(Context context, Bundle bundle) {        HomePageFragment newFragment = new HomePageFragment();        newFragment.setArguments(bundle);        return newFragment;    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        mRecyclerView =                (RecyclerView) inflater.inflate(R.layout.fragment_homepage, container, false);        initView();        initData();        return mRecyclerView;    }    protected void initView() {        queue = Volley.newRequestQueue(getActivity());        mDatas = new ArrayList<>();        mAdapter = new HomepageAdapter(getContext(), mDatas);    }    protected void initData() {        //网络请求与JSON解析        JsonObjectRequest request = new JsonObjectRequest(Url.INTENT_NEWS_URL,                null, new Response.Listener<JSONObject>() {            @Override            public void onResponse(JSONObject response) {                Gson gson = new Gson();                bean = gson.fromJson(String.valueOf(response), Bean.class);                mDatas.addAll(bean.getResult().getData());                mAdapter.notifyDataSetChanged();            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                Util.showLog("mylog", error.toString());            }        });        queue.add(request);        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));//这里可以选择是listView还是GridView        mRecyclerView.setAdapter(mAdapter = new HomepageAdapter(getContext(), mDatas));//或者是瀑布流(设置的高度        setHeader(mRecyclerView);        mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),//不能固定,并且得随机给item一个高度                DividerItemDecoration.VERTICAL_LIST));        mAdapter.setOnItemClickLitener(new HomepageAdapter.OnItemClickLitener() {            @Override            public void onItemClick(View view, int position) {                Util.showToast(getContext(), position + "click");                Intent intent = new Intent(getActivity(), WebActivity.class);                Bean.ResultBean.DataBean url = mDatas.get(position - 1);                intent.putExtra("url", url.getUrl());                startActivity(intent);            }            @Override            public void onItemLongClick(View view, int position) {                Util.showToast(getContext(), position + "long click");            }        });    }    private void setHeader(RecyclerView view) {        View header = LayoutInflater.from(getContext()).inflate(R.layout.activity_banner, view, false);//子布局        mAdapter.setHeaderView(header);    }}




0 1