1)添加headview和footerview
思路:参考ListView的addHeadView方法封装构建一个Adapter封装类,在adpter中维护一个HeaderView和FooterView数组,在onCreateViewHolder方法中为每一个HeaderView构建一个ViewHolder。
正解:github大神提供的组件借用之,哈哈。路径奉上:
https://github.com/cundong/HeaderAndFooterRecyclerView/blob/master/library/src/main/java/com/cundong/recyclerview/HeaderAndFooterRecyclerViewAdapter.java
2)检测RecycleView是否滑动到底部:
思路:RecycleView可以用提供多种布局如线性布局,网格布局以及瀑布流布局。这种不同形式的布局是通过对应布局管理实现的。通过这个这个布局管理器我们可以获取到第一个可见视图的position,最后一个可见视图的position等信息。解决这个问题的思路就是在滑动过程中判断最后一个可见视图的position和getItemCount()返回将要构建的视图总数进行比较,判断是否到达底部,代码附上:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState==0){
//0为idle状态
RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
if (layoutManager instanceof StaggeredGridLayoutManager){
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
int column = staggeredGridLayoutManager.getColumnCountForAccessibility(null,null);
int[] positions = new int[column];
staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(positions);
for (int i =0;i<positions.length;i++){
if (positions[i]>=staggeredGridLayoutManager.getItemCount()-column
&& staggeredGridLayoutManager.findViewByPosition(positions[i]).getBottom()<=
mRecyclerView.getHeight()){
Log.d("log","到底了");
break;
}
}
}else if (layoutManager instanceof LinearLayoutManager){
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
int position = linearLayoutManager.findLastVisibleItemPosition();
if (position==linearLayoutManager.getItemCount()-1&&
linearLayoutManager.findViewByPosition(position).getBottom()<= mRecyclerView.getHeight()){
Log.d("log","到底了");
}
}
}
super.onScrollStateChanged(recyclerView, newState);
}
});
3)对RecycleView添加中的item添加监听:
由于RecycleView没有提供ListView的onItemSelectedLisenter方法,所以需要单独自己实现。解决这个问题的方法是adpater在构建ViewHolder对象的时候为itemView添加一个OnClickListener监听,然后实现这个监听接口相关功能。代码如下:
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView textView;
public ImageView imageView;
public TextView displayTextView;
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickedListener.onItemClicked(v,getPosition());
}
});
textView = (TextView) itemView.findViewById(R.id.news_item_title);
imageView = (ImageView) itemView.findViewById(R.id.news_item_imageview);
displayTextView = (TextView) itemView.findViewById(R.id.display_date);
}
}
另外记录另外一个问题:
发现另外一个现象任何视图的Clickable属性设置false的时候一旦添加了加添这个false属性便会失效。列如:
itemView.setClickable(false);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickedListener.onItemClicked(v,getPosition());
}
});
主要是应为一旦调用了temView.setOnClickListener对应视图的Clickable属性就会设置true:
android中的对应的代码如下:
public void setOnClickListener(@Nullable OnClickListener l) {
if (!isClickable()) {
setClickable(true);
}
getListenerInfo().mOnClickListener = l;
}
所以切记不要在布局中将clickable设置false然后在某个地方调用setOnClickListener,然后出现一个神一样现象。