作者:萍聚20121018 | 来源:互联网 | 2022-08-03 14:28
使用RecyclerView越来越多了,基本可以不用listview了,但是这个新的控件谷歌官方似乎设计的没有想listview那样方便快捷,listview自带有headview和 footerview所有我们很方便的可以实现上拉,下拉刷新,但是我们使用recyclerview就没有那样的舒服了,需要自己动手来实现这两个模块了。
本人参考了其他几篇博客使用了下感觉都有bug存在,于是自己改进了下,基本实现了功能,由于时间原因代码封装的还不彻底,仅供参考。
首页布局:activity_notice
<&#63;xml version="1.0" encoding="utf-8"&#63;>
子item布局:item_base
<&#63;xml version="1.0" encoding="utf-8"&#63;>
脚布局 item_foot
<&#63;xml version="1.0" encoding="utf-8"&#63;>
toolbar
<&#63;xml version="1.0" encoding="utf-8"&#63;>
首页 MainActivity
package com.lxl.refresh;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import butterknife.ButterKnife;
import butterknife.InjectView;
/**
* Description:
* Author:lxl
* Date: 2016/10/9 10:15
*/
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.toolbar)
Toolbar toolbar;
@InjectView(R.id.recyclerView)
RecyclerView recyclerView;
@InjectView(R.id.SwipeRefreshLayout)
SwipeRefreshLayout swipeRefreshLayout;
boolean isSlidingToLast = false; //判断滚动状态
boolean isLoading;
private List
在第106行中通过这三个条件判断就可以下拉刷新的执行。
RecyclerView的适配器:RecyclerViewAdapter
package com.lxl.refresh;
import android.content.Context;
import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.util.List;
public class RecyclerViewAdapter extends Adapter {
private static final int TYPE_ITEM = 0;
private static final int TYPE_FOOTER = 1;
private Context context;
private List data;
protected FootViewHolder footerHolder;
public RecyclerViewAdapter(Context context, List data) {
this.cOntext= context;
this.data = data;
}
//-------------------------------------
public interface onHolderCreate{ //定义一个viewholder回调接口
void created();
}
public onHolderCreate getmCreateViewHolder() {
return mCreateViewHolder;
}
public void setmCreateViewHolder(onHolderCreate mCreateViewHolder) {
this.mCreateViewHolder = mCreateViewHolder;
}
private onHolderCreate mCreateViewHolder;
//-------------------------------------
public interface OnItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.OnItemClickListener= onItemClickListener;
}
@Override
public int getItemCount() {
return data.size() == 0 &#63; 0 : data.size() + 1; //添加脚布局
}
@Override
public int getItemViewType(int position) {
if (position + 1 == getItemCount()) {
return TYPE_FOOTER; //脚布局
} else {
return TYPE_ITEM; //普通item
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_ITEM) { //创建普通类型的item布局
View view = LayoutInflater.from(context).inflate(R.layout.item_base, parent,
false);
Log.d("test", "创建普通类型的item布局");
return new ItemViewHolder(view);
} else if (viewType == TYPE_FOOTER) { //创建脚布局类型的item布局
View view = LayoutInflater.from(context).inflate(R.layout.item_foot, parent,
false);
footerHolder=new FootViewHolder(view);
Log.d("test", "创建脚布局类型的item布局");
return footerHolder;
}
return null;
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
//在onCreateViewHolder执行完成后回调
if (holder instanceof FootViewHolder){
if (mCreateViewHolder!=null){
mCreateViewHolder.created();
}
}
if (holder instanceof ItemViewHolder) {
//holder.tv.setText(data.get(position));
if (onItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getLayoutPosition();
onItemClickListener.onItemClick(holder.itemView, position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position = holder.getLayoutPosition();
onItemClickListener.onItemLongClick(holder.itemView, position);
return false;
}
});
}
}
}
static class ItemViewHolder extends ViewHolder {
TextView tv;
public ItemViewHolder(View view) {
super(view);
tv = (TextView) view.findViewById(R.id.tv_date);
}
}
class FootViewHolder extends ViewHolder {
LinearLayout ll;
ProgressBar pb;
TextView tv;
public FootViewHolder(View view) {
super(view);
ll=(LinearLayout) view.findViewById(R.id.ll);
pb=(ProgressBar) view.findViewById(R.id.progressBar);
tv=(TextView) view.findViewById(R.id.tv);
}
}
}
在第30行定义一个借口用来通知下拉刷新后隐藏脚布局,主要在onCreateViewHolder执行完成后回调。
看看效果图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。