安卓学习笔记-----为RecyclerView添加Header
程序员文章站
2022-05-05 14:33:47
...
为RecyclerView添加header
通过控制Adapter的itemType来设置,根据不同的itemType去加载不同的布局。
重写了getItemViewType方法,并根据位置来返回不同的type,然后在onCreateViewHolder方法中来判断itemType,如果是header,则返回设置的headerView,否则正常加载item布局
Adapter代码
public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private ArrayList<String> mDatas = new ArrayList<>();
private View mHeaderView;
private OnItemClickListener mListener;
public void setonItemClickListener(OnItemClickListener li) {
mListener = li;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderView() {
return mHeaderView;
}
public void addDatas(ArrayList<String> datas) {
mDatas.addAll(datas);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (mHeaderView == null) {
return TYPE_NORMAL;
}
if (position == 0) {
return TYPE_HEADER;
}
return TYPE_NORMAL;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new Holder(mHeaderView);
}
View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new Holder(layout);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER) {
return;
}
final int pos = getRealPosition(holder);
final String data = mDatas.get(pos);
if (holder instanceof Holder) {
((Holder) holder).text.setText(data);
if (mListener == null) {
return;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(pos, data);
}
});
}
}
public int getRealPosition(RecyclerView.ViewHolder holder) {
int position = holder.getPosition();
return mHeaderView == null ? position : position - 1;
}
@Override
public int getItemCount() {
return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
}
class Holder extends RecyclerView.ViewHolder {
TextView text;
public Holder(View itemView) {
super(itemView);
if (itemView == mHeaderView) {
return;
}
text = (TextView) itemView.findViewById(R.id.num);
}
}
interface OnItemClickListener {
void onItemClick(int position, String data);
}
}
下面是MainActivity
public class HeaderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private ArrayList<String> mDatas = new ArrayList<>();
private View mHeaderView;
private OnItemClickListener mListener;
public void setonItemClickListener(OnItemClickListener li) {
mListener = li;
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderView() {
return mHeaderView;
}
public void addDatas(ArrayList<String> datas) {
mDatas.addAll(datas);
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (mHeaderView == null) {
return TYPE_NORMAL;
}
if (position == 0) {
return TYPE_HEADER;
}
return TYPE_NORMAL;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) {
return new Holder(mHeaderView);
}
View layout = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new Holder(layout);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (getItemViewType(position) == TYPE_HEADER) {
return;
}
final int pos = getRealPosition(holder);
final String data = mDatas.get(pos);
if (holder instanceof Holder) {
((Holder) holder).text.setText(data);
if (mListener == null) {
return;
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(pos, data);
}
});
}
}
public int getRealPosition(RecyclerView.ViewHolder holder) {
int position = holder.getPosition();
return mHeaderView == null ? position : position - 1;
}
@Override
public int getItemCount() {
return mHeaderView == null ? mDatas.size() : mDatas.size() + 1;
}
class Holder extends RecyclerView.ViewHolder {
TextView text;
public Holder(View itemView) {
super(itemView);
if (itemView == mHeaderView) {
return;
}
text = (TextView) itemView.findViewById(R.id.num);
}
}
interface OnItemClickListener {
void onItemClick(int position, String data);
}
}
刚开始看着教程写的云里雾里的,写完之后看了一下讲解,然后又看了几遍代码才搞明白Adapter里是怎样设置的。
转载于:https://www.jianshu.com/p/1a0c5df2de3f