Author: Zhuang Superman Link: https://www.jianshu.com/p/42254630bdce
Because the development trend has become to use RecyclerView instead of ListVIew, but most of the blog content on the Internet is relatively simple, many uses are not clear, and I have taken many detours in the use process, so I hereby record my experience. First, inherit the parent class
extends RecyclerView.Adapter<RecyclerView.ViewHolder>
You need to implement the following functions
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}
@Override
public int getItemCount() {
return 0;
}
onCreateViewHolder() is responsible for creating views for items, and onBindViewHolder() is responsible for binding data to the views of items. Then you need a ViewHolder.
public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView newsType;
public MenuItemViewHolder(View v) {
super(v);
newsType = (TextView)v.findViewById(R.id.tv_item);
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v, this.getPosition());
}
}
}
The above is the basic usage, through which you can use a suggested RecyclerView.
But if the RecyclerView needs to set the view view of multiple items, it needs to set several variables and use this function
private static final int TYPE_TOPIC = 0;
private static final int TYPE_TITLE = 1;
Override
public int getItemViewType(int position) {}
After setting its Type for each item through getItemViewType(), you can create the corresponding view according to the Type in onCreateViewHolder().
If you need to use headerview like ListView, you need to customize a headerview in advance. The example is as follows
private View mHeaderView;
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
And set it in ViewHolder.
public MainTopicViewHolder (View itemView) {
super(itemView);
if (itemView == mHeaderView) return;
tv_topic = (TextView) itemView.findViewById(R.id.tv_topic);
}
When setting listening, you need to define the interface and set functions in the Adapter
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
And bind the listener when onBindViewHolder() is bound
if (mOnItemClickListener != null) {
((MainTopicViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
Override
public void onClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, pos);
}
});
}
In the future, if you have other experience on this basis, please add a complete example
public class MainNewsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_TOPIC = 1;
private static final int TYPE_TITLE = 2;
private Context mContext;
private OnItemClickListener mOnItemClickListener;
private List<StoriesEntity> list;
private ImageLoader imageLoader;
private DisplayImageOptions displayImageOptions;
private View mHeaderView;
public MainNewsAdapter(Context context) {
mContext = context;
list = new ArrayList<>();
imageLoader = ImageLoader.getInstance();
displayImageOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build();
}
public void addList(List<StoriesEntity> items) {
this.list.addAll(items);notifyDataSetChanged();
}
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0);
}
public View getHeaderView() {
return mHeaderView;
}
public StoriesEntity getItem(int position) {
return list.get(position-1);
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEADER;
} else {
StoriesEntity entity = list.get(position-1);
if (entity.getType() == Constant.TOPIC) {
return TYPE_TOPIC;
} else {
return TYPE_TITLE;
}
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_TOPIC) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_news_topic, parent, false);
MainTopicViewHolder mainTopicViewHolder = new MainTopicViewHolder(v);
return mainTopicViewHolder;
} else if (viewType == TYPE_TITLE) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_news_item, parent, false);
MainNewsViewHolder mainNewsViewHolder = new MainNewsViewHolder(v);
return mainNewsViewHolder;
} else {
MainTopicViewHolder mainTopicViewHolder = new MainTopicViewHolder(mHeaderView);
return mainTopicViewHolder;
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
if (position == 0) {
return;
}
if (holder instanceof MainNewsViewHolder) {
StoriesEntity entity = list.get(position — 1);
((MainNewsViewHolder) holder).tv_title.setText(entity.getTitle());
imageLoader.displayImage(entity.getImages().get(0),((MainNewsViewHolder) holder).iv_title, displayImageOptions);
if (mOnItemClickListener != null) {
((MainNewsViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, pos);
}
});
}
} else {
StoriesEntity entity = list.get(position-1);
((MainTopicViewHolder) holder).tv_topic.setVisibility(View.VISIBLE);((MainTopicViewHolder) holder).tv_topic.setText(entity.getTitle());
if (mOnItemClickListener != null) {
((MainTopicViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v) {
int pos = holder.getLayoutPosition();
mOnItemClickListener.onItemClick(holder.itemView, pos);
}
});
}
}
}
@Override
public int getItemCount() {
return mHeaderView == null ? list.size() : list.size() + 1;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
public class MainTopicViewHolder extends RecyclerView.ViewHolder {
TextView tv_topic;
public MainTopicViewHolder(View itemView) {
super(itemView);
if (itemView == mHeaderView) return;
tv_topic = (TextView) itemView.findViewById(R.id.tv_topic);
}
}
public class MainNewsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tv_title;
ImageView iv_title;
public MainNewsViewHolder(View itemView) {
super(itemView);
tv_title = (TextView) itemView.findViewById(R.id.tv_title);
iv_title = (ImageView) itemView.findViewById(R.id.iv_title);}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(v, this.getPosition());
}
}
}
}