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

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




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值