package org.yczbj.ycrefreshview.staggered; import android.content.Context; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import org.yczbj.ycrefreshview.R; import org.yczbj.ycrefreshview.data.PersonData; import org.yczbj.ycrefreshviewlib.inter.OnItemClickListener; import java.util.ArrayList; import java.util.List; public class StageredLoadMoreAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context mContext; private OnItemClickListener listener; /** * 第一种ViewType,正常的item */ private int normalType = 0; /** * 第二种ViewType,底部的提示View */ private int footType = 1; /** * 变量,是否有更多数据 */ private boolean hasMore; /** * 变量,是否隐藏了底部的提示 */ private boolean fadeTips = false; /** * 获取主线程的Handler */ private Handler mHandler = new Handler(Looper.getMainLooper()); public StageredLoadMoreAdapter(Context context, boolean hasMore) { this.mContext = context; this.hasMore = hasMore; } private List<PersonData> data = new ArrayList<>(); public void setData(List<PersonData> data) { this.data = data; notifyDataSetChanged(); } public void setOnClickListener(OnItemClickListener listener) { this.listener = listener; } /** * 暴露接口,改变fadeTips的方法 */ public boolean isFadeTips() { return fadeTips; } /** * 暴露接口,更新数据源,并修改hasMore的值,如果有增加数据,hasMore为true,否则为false */ public void updateList(List<PersonData> newDatas, boolean hasMore) { int size = data.size(); // 在原有的数据之上增加新数据 if (newDatas != null) { data.addAll(newDatas); this.hasMore = hasMore; notifyItemRangeInserted(size,newDatas.size()); } } /** * 自定义方法,获取列表中数据源的最后一个位置,比getItemCount少1,因为不计上footView */ public int getRealLastPosition() { return data.size(); } @Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { super.onViewAttachedToWindow(holder); ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); if (layoutParams != null && layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager.LayoutParams) layoutParams; int position = holder.getLayoutPosition(); //如果是上拉加载更多类型,则设置setFullSpan为true,那么它就会占一行 if (getItemViewType(position) == footType) { params.setFullSpan(true); } } } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 根据返回的ViewType,绑定不同的布局文件,这里只有两种 if (viewType == normalType) { return new MyViewHolder(LayoutInflater.from(mContext) .inflate(R.layout.item_image, parent,false)); } else { //这个是上拉加载更多的view return new FootHolder(LayoutInflater.from(mContext) .inflate(R.layout.view_more, parent,false)); } } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { if (holder instanceof MyViewHolder){ PersonData person = data.get(position); setBindViewHolder((MyViewHolder)holder,person,position); }else { setFootBindViewHolder((FootHolder)holder ,position); } } /** * 获取条目数量,之所以要加1是因为增加了一条footView */ @Override public int getItemCount() { return data == null ? 0 : data.size()+1; } /** * 根据条目位置返回ViewType,以供onCreateViewHolder方法内获取不同的Holder */ @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return footType; } else { return normalType; } } class MyViewHolder extends RecyclerView.ViewHolder { private ImageView iv_news_image; MyViewHolder(final View itemView) { super(itemView); iv_news_image = itemView.findViewById(R.id.iv_news_image); itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (listener != null) { listener.onItemClick(getAdapterPosition()); } } }); } } class FootHolder extends RecyclerView.ViewHolder { private TextView tv_more; FootHolder(View itemView) { super(itemView); tv_more = itemView.findViewById(R.id.tv_more); } } private void setBindViewHolder(MyViewHolder holder, PersonData person, int position) { ViewGroup.LayoutParams params = holder.iv_news_image.getLayoutParams(); int setHeight = position%5; //计算View的高度 int height = 300; switch (setHeight){ case 0: height = 500; break; case 1: height = 750; break; case 2: height = 880; break; case 3: height = 360; break; case 4: height = 660; break; default: break; } params.height = height; holder.iv_news_image.setLayoutParams(params); Glide.with(holder.iv_news_image.getContext()) .load(person.getImage()) .error(R.drawable.bg_small_tree_min) .placeholder(R.drawable.bg_small_tree_min) .into(holder.iv_news_image); } private void setFootBindViewHolder(final FootHolder holder, int position) { // 之所以要设置可见,是因为我在没有更多数据时会隐藏了这个footView holder.tv_more.setVisibility(View.VISIBLE); // 只有获取数据为空时,hasMore为false,所以当我们拉到底部时基本都会首先显示“正在加载更多...” if (hasMore) { // 不隐藏footView提示 fadeTips = false; if (data.size() > 0) { // 如果查询数据发现增加之后,就显示正在加载更多 holder.tv_more.setText("逗比,正在加载更多..."); } } else { if (data.size() > 0) { // 如果查询数据发现并没有增加时,就显示没有更多数据了 holder.tv_more.setText("逗比,没有更多数据了"); // 然后通过延时加载模拟网络请求的时间,在500ms后执行 mHandler.postDelayed(new Runnable() { @Override public void run() { // 隐藏提示条 holder.tv_more.setVisibility(View.GONE); // 将fadeTips设置true fadeTips = true; // hasMore设为true是为了让再次拉到底时,会先显示正在加载更多 hasMore = true; } }, 500); } } } }