###显示效果图

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//是否是最后一个显示的item位置
int lastVisiableItemPosition = manager.findLastVisibleItemPosition();
if (lastVisiableItemPosition + 1 == mCategoryAdapter.getItemCount()){
if (!isLoading){
isLoading = true; //标志位 防止重复加载数据
handler.postDelayed(new Runnable() {
@Override
public void run() {
//requestData();
requestLoadMoreData(); //请求数据
// Toast.makeText(MainActivity.this, "已经没有新的了", Toast.LENGTH_SHORT).show();
isLoading = false; //加载完成数据 更新标志位
// adapter.notifyItemRemoved(adapter.getItemCount());
}
},2000);
}
}
}
});
private void requestLoadMoreData(){
index++; //这个是模拟加载几次之后通知没有数据的
if (index <= 3) {
initData();
} else {
Toast.makeText(MainActivity.this, "已经没有新的了", Toast.LENGTH_SHORT).show();
}
// swipeRefreshLayout.setRefreshing(false);
mCategoryAdapter.notifyItemRemoved(mCategoryAdapter.getItemCount()); //加载完成之后移除footerView,也就是隐藏(去除加载中的view)
}
这样就可以很简单的实现上拉加载更多的逻辑实现了,(这个需要添加一个footerView,接下来就来分析一下如果添加FooterView,还有就是添加HeaderView) ###Adapter如果写 首先定义三个变量用来说明是哪一个View,(HeaderView、View、FooterView)
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private static final int TYPE_FOOTER = 2;
#####RecyclerView提供个getItemViewType(int position)方法来判断需要展示的哪种类型的View
if (mHeaderView == null) return TYPE_NORMAL;
if (position == 0) return TYPE_HEADER;
if (mHeaderView != null && position +1 == getItemCount()) return TYPE_FOOTER;
if (mHeaderView == null && position == getItemCount()) return TYPE_FOOTER;
return TYPE_NORMAL;
对于FooterView和HeaderView我们可以共用同一个ViewHolder(其实也就是使用一下,对于HeaderView的点击事件我们是在Activity或者Fragment里面去写的,后面有介绍)。这个时候我们在绑定ViewHolder的时候去判断我们需要展示的哪种View
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) return new ViewHolder(mHeaderView);
if (viewType == TYPE_FOOTER) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot, parent, false);
return new FooterViewHolder(view);
}
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_item_layout, parent, false);
return new ViewHolder(view);
}
#####对于正常View的ViewHolder也是正常的写,按照之前的正常使用RecyclerView的方式。例如:
class ViewHolder extends RecyclerView.ViewHolder {
private LinearLayout mCategoryLl;
private ImageView mCategoryImg;
private TextView mCategoryTitle, mCategoryDes;
public ViewHolder(View itemView) {
super(itemView);
mCategoryImg = (ImageView) itemView.findViewById(R.id.category_book_img);
mCategoryTitle = (TextView) itemView.findViewById(R.id.category_title);
mCategoryDes = (TextView) itemView.findViewById(R.id.category_book_des);
mCategoryLl = (LinearLayout) itemView.findViewById(R.id.category_ll);
}
}
#####对于HeaderView,我们的处理方式(在Adapter里面进行)
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0); //位于顶部,通知一下view的第一项
}
#####这个时候通过在activity或者fragment里面进行
private void setHeader(RecyclerView view) {
//找到控件布局
View header = LayoutInflater.from(this).inflate(R.layout.category_item_header, view, false);
mRlBoy = (RelativeLayout) header.findViewById(R.id.rl_boy);
mRlGirl = (RelativeLayout) header.findViewById(R.id.rl_girl);
mRlEnd = (RelativeLayout) header.findViewById(R.id.rl_end);
mRlUpdate = (RelativeLayout) header.findViewById(R.id.rl_update);
mCategoryAdapter.setHeaderView(header); //设置headerview
}
#####HeaderView控件监听方式可以如下:
private void initListener() {
mRlBoy.setOnClickListener(this);
mRlGirl.setOnClickListener(this);
mRlEnd.setOnClickListener(this);
mRlUpdate.setOnClickListener(this);
}
基本到此为止,就能实现一般的需求了,如果有复杂的,应该还是存在其他方式的实现,以后有空或者有此需求之后自己在去研究。
#####解决在GridView形式下,HeaderView和FooterView只显示在最前面一个或者最后面一个(而不是占据一行bug)
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(gridLayoutManager);
// gridLayoutManager 布局管理器
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//如果是第一个(添加HeaderView) 还有就是最后一个(FooterView)
return position == mCategoryBean.size() + 1 || position == 0 ? gridLayoutManager.getSpanCount() : 1;
}
});
#####效果如开始哈,在次就贴下代码吧。 代码传动门:demo地址