先看效果图:
实现:
public class TestAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//正常条目
private static final int TYPE_NORMAL_ITEM = 0;
//加载更多
private static final int TYPE_FOOTER_ITEM = 1;
private View footerView;
RecyclerView.LayoutManager mlayoutManager;
private List<String> mDatas;
Context context;
public TestAdapter(RecyclerView.LayoutManager mlayoutManager, List<String> list, Context context) {
this.mlayoutManager = mlayoutManager;
mDatas = list;
this.context = context;
}
public interface OnItemClickLitener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickLitener mOnItemClickLitener;
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
this.mOnItemClickLitener = mOnItemClickLitener;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_NORMAL_ITEM) {
ItemViewHolder holder = new ItemViewHolder(LayoutInflater.from(context).inflate(R.layout.testitem, parent, false));
return holder;
} else {
footerView = LayoutInflater.from(parent.getContext()).inflate(
R.layout.footerview, null);
GridLayoutManager.LayoutParams params = new GridLayoutManager.LayoutParams(GridLayoutManager.LayoutParams.MATCH_PARENT,
GridLayoutManager.LayoutParams.WRAP_CONTENT);
((GridLayoutManager) mlayoutManager).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = getItemViewType(position);
if (type == TYPE_FOOTER_ITEM) {
return 2;
} else {
return 1;
}
}
});
footerView.setLayoutParams(params);
return new FooterViewHolder(footerView);
}
}
public void setFooterNoMore(String txt) {
TextView tv_footer = (TextView) footerView.findViewById(R.id.tv_footer);
ContentLoadingProgressBar progress = (ContentLoadingProgressBar) footerView.findViewById(R.id.progress);
progress.setVisibility(View.INVISIBLE);
tv_footer.setText(txt);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof ItemViewHolder) {
((ItemViewHolder) holder).tv.setText(mDatas.get(position));
if (mOnItemClickLitener != null) {
((ItemViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CommonUtils.toast(context, mDatas.get(position));
}
});
}
}
}
@Override
public int getItemCount() {
return mDatas.size();
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER_ITEM;
} else {
return TYPE_NORMAL_ITEM;
}
}
class ItemViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public ItemViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
class FooterViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public FooterViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
}
}
}
public class TestActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener, TestAdapter.OnItemClickLitener {
SwipeRefreshLayout swipeRefreshLayout;
RecyclerView recyclerView;
private List<String> mDatas;
MyHandler myHandler;
int lastVisibleItem;
TestAdapter adapter;
RecyclerView.LayoutManager layoutManager;
@Override
public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position) {
}
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 0) {
swipeRefreshLayout.setRefreshing(false);
} else if (msg.what == 1) {
adapter.setFooterNoMore("全部加载完");
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
myHandler = new MyHandler();
initdata();
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.black), getResources().getColor(R.color.colorAccent), getResources().getColor(R.color.green));
swipeRefreshLayout.setOnRefreshListener(this);
layoutManager = new GridLayoutManager(this, 2);
adapter = new TestAdapter(layoutManager, mDatas, this);
adapter.setOnItemClickLitener(this);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItem + 1 == adapter.getItemCount()) {
// 此处在现实项目中,请换成网络请求数据代码,sendRequest .....
myHandler.sendEmptyMessageDelayed(1, 3000);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
lastVisibleItem = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
}
});
}
private void initdata() {
mDatas = new ArrayList<String>();
for (int i = 1; i < 120; i++) {
mDatas.add("zzz" + i);
}
}
@Override
public void onRefresh() {
CommonUtils.toast(this, "刷新~~~");
myHandler.sendEmptyMessageDelayed(0, 5000);
}
}