思路
- 在RecycleView的Adapter里面声明一个内部view变量
- 然后在CreatView方法里面判断位置,如果是position为0的话就代表加载的是第一个
- 那么就把我们事先声明的View放在这个位置
代码
public class RecycleViewAdapter extends RecyclerView.Adapter<RecycleViewAdapter.ViewHolder> {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private View mHeaderView;
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderView() {
return mHeaderView;
}
@Override
public int getItemViewType(int position) {
if(mHeaderView == null) return TYPE_NORMAL;
if(position == 0) return TYPE_HEADER;
return TYPE_NORMAL;
}
private List<News> newsList;
private Context context;
public RecycleViewAdapter(Context context,ArrayList<News> list){
this.newsList = list;
this.context = context;
}
class ViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
TextView title;
TextView schoolAndTime;
public ViewHolder(View itemView) {
super(itemView);
if(itemView == mHeaderView) return;
imageView = itemView.findViewById(R.id.main_Fra1RecVeiwItemImage);
title = itemView.findViewById(R.id.main_Fra1RecVeiwItemTitle);
schoolAndTime = itemView.findViewById(R.id.main_Fra1RecVeiwItemSchoolAndTime);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(mHeaderView != null && viewType == TYPE_HEADER) return new ViewHolder(mHeaderView);
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment1recyclenews,parent,false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if(getItemViewType(position) == TYPE_HEADER) return;
final int pos = getRealPosition(holder);
final News news = newsList.get(pos);
Picasso.with(context).load(news.ImageUrl).into(holder.imageView);
holder.title.setText(news.title);
holder.schoolAndTime.setText(news.schoolAndTime);
}
public int getRealPosition(ViewHolder holder) {
int position = holder.getLayoutPosition();
return mHeaderView == null ? position : position - 1;
}
@Override
public int getItemCount() {
return mHeaderView == null ? newsList.size() : newsList.size() + 1;
}
}
解释
- 具体的东西在代码中写的比较清楚了,这里解释一下不太容易理解的部分
- getItemCount这个方法,如果有HeaderView的话,那么这个返回的子项数据就应该加一,因为要加上HeaderView,所以数量要加一