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