RecycleView小结:
多种布局问题:1.每种布局的排列位置
2.每个布局,每一行的多少列
第一步:创建布局。
第二步:布局排列,首先RecyclerView.Adapter类自动会实现onCreateViewHolder(),onBindViewHolder()getItemCount()三个方法,如果对布局排列需要重写getItemType()方法,继续根据每种布局继承RecyclerView.ViewHolder创建ViewHolder。
然后,最简单的从上到下没有重复一次性排列,那就有多少布局就有多少ItemType,根据排列位置,就是对position进行分段;
接着,根据ItemType进行CreateView,ItemType与onCreateViewHolder()参数ViewType是相等的,然后在onBindViewHolder()通过instansof进行ViewHolder加载,getItemCount()方法直接返回数据的长度即可。
最后,这边使用GrideLayoutManager做例子,通过setSpanSizeLookup()设置每个布局的每行占据多少列,
recyclerView.setLayoutManager(new GridLayoutManager(
recyclerView.getContext(),4,
GridLayoutManager.VERTICAL,
false
));上面的4是说一行最多分成4分
public class RecycleViewMainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<NovelBean> list;
private Context context;
private static final int ITEM_TYPE1 = 1;
private static final int ITEM_TYPE2 = 2;
private static final int ITEM_TYPE3 = 3;
public RecycleViewMainAdapter(List<NovelBean> list, Context context) {
this.list = list;
this.context = context;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case ITEM_TYPE1:
return new GrideViewHolder(LayoutInflater.from(
parent.getContext()).inflate(
R.layout.adapter_gride_main,
parent, false));
case ITEM_TYPE2:
return new TextViewHolder(LayoutInflater.from(
parent.getContext()).inflate(
R.layout.adapter_text_main,
parent, false));
case ITEM_TYPE3:
return new ListViewHolder(LayoutInflater.from(
parent.getContext()).inflate(
R.layout.adapter_list_main,
parent, false));
default:
return null;
}
}
@Override
public int getItemViewType(int position) {
if (position<6){
return ITEM_TYPE1;
}else if(position==6){
return ITEM_TYPE2;
}else if(position>6){
return ITEM_TYPE3;
}
return super.getItemViewType(position);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof GrideViewHolder){
bindGrideView((GrideViewHolder) holder,list.get(position));
}else if(holder instanceof TextViewHolder){
bindTextView((TextViewHolder) holder,list.get(position));
}else if(holder instanceof ListViewHolder){
bindListView((ListViewHolder) holder,list.get(position));
}
}
private void bindGrideView(GrideViewHolder holder, NovelBean data) {
if (TextUtils.isEmpty(data.getBookName())){
holder.tv_name.setText("");
holder.tv_des.setText("");
}else{
holder.tv_name.setText(data.getBookName());
holder.tv_des.setText(data.getDescription());
getPicture(data,holder.iv_bitmap);
}
}
private void bindTextView(TextViewHolder holder, NovelBean data) {
}
private void bindListView(ListViewHolder holder, NovelBean data) {
holder.tv_author.setText(data.getAuthor());
holder.tv_catagory.setText(data.getCatagory());
holder.tv_latchapter.setText(data.getLastChapter());
holder.tv_bookname.setText(data.getBookName());
holder.tv_updatetime.setText(data.getLastTime());
}
@Override
public int getItemCount() {
return list.size();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
GridLayoutManager manager = (GridLayoutManager) recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager){
GridLayoutManager grideManager = (GridLayoutManager) manager;
grideManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//根据总的百分比
int type = getItemViewType(position);
switch (type){
case ITEM_TYPE1:
return 2;
case ITEM_TYPE2:
return 4;
case ITEM_TYPE3:
return 4;
default:
return 4;
}
}
});
}
}
private class GrideViewHolder extends RecyclerView.ViewHolder {
private TextView tv_name;
private TextView tv_des;
private ImageView iv_bitmap;
public GrideViewHolder(View itemView) {
super(itemView);
iv_bitmap = (ImageView) itemView.findViewById(R.id.iv_gride_main);
tv_des = (TextView) itemView.findViewById(R.id.tv_description_gride_main);
tv_name = (TextView) itemView.findViewById(R.id.tv_name_gride_main);
}
}
private class TextViewHolder extends RecyclerView.ViewHolder{
public TextViewHolder(View itemView) {
super(itemView);
}
}
private class ListViewHolder extends RecyclerView.ViewHolder {
private TextView tv_author;
private TextView tv_catagory;
private TextView tv_latchapter;
private TextView tv_bookname;
private TextView tv_updatetime;
public ListViewHolder(View itemView) {
super(itemView);
tv_author = (TextView) itemView.findViewById(R.id.tv_author_list_main);
tv_catagory = (TextView) itemView.findViewById(R.id.tv_catagory_list_main);
tv_latchapter = (TextView) itemView.findViewById(R.id.tv_lastChapter_list_main);
tv_bookname = (TextView) itemView.findViewById(R.id.tv_name_list_main);
tv_updatetime = (TextView) itemView.findViewById(R.id.tv_updatetime_list_main);
}
}
public void getPicture(NovelBean data, ImageView iv) {
Glide.with(context).load(data.getBookBitmapURL()).listener(new RequestListener<String, GlideDrawable>()
{
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource)
{
//Log.e(MainActivity.class.getSimpleName(), "e=" + e.getMessage());
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target,
boolean isFromMemoryCache, boolean isFirstResource)
{
return false;
}
}) .skipMemoryCache(false)
.fitCenter().into(iv);
}}