许许多多的项目都开始从ListView转到RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情。
今天我们写RecyclerView的下拉刷新,头部,尾部,。
我们看一下效果图:
SwipeRefreshLayout实现很简单,重点是滑动到底部自动加载应该如何实现,其实其实现的方式类似于ListView的实现方式。
看我们需要导的包
//recyclerview列表 implementation 'com.android.support:recyclerview-v7:26.1.0'
看一下activity布局文件:布局文件就两个控件,SwipeRefreshLayout中嵌套RecyclerView。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/recyclerView_SwipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#d9d9d9"
android:padding="20dp">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
在代码中初始化RecyclerView以及实现adapter等,。就直接上代码了,。
public class RecyclerView1Activity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
private RecyclerView recyclerView;
private List<String> list = new ArrayList<>();;
private RecyclerView1Adapter recyclerView1Adapter;
private SwipeRefreshLayout swipeRefreshLayout;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what==1) {
recyclerView1Adapter.notifyDataSetChanged();
recyclerView1Adapter.isLoadComplet = true;
}else{
swipeRefreshLayout.setRefreshing(false);
}
}
};
@Override
public void onRefresh() {
initNet();
initData();
handler.sendEmptyMessageDelayed(2,2000l);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recyclerview);
recyclerView = findViewById(R.id.recyclerview);
swipeRefreshLayout = findViewById(R.id.recyclerView_SwipeRefresh);
swipeRefreshLayout.setRefreshing(true);//让刷新的动画显示出来
onRefresh();//刚进入的时候,主动调用刷新回调接口
swipeRefreshLayout.setOnRefreshListener(this);
//做加载更多的监听的方法
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager linearLayoutManager1 = (LinearLayoutManager)recyclerView.getLayoutManager();
int lastIndex =linearLayoutManager1.findLastVisibleItemPosition();
int countItem = linearLayoutManager1.getItemCount();
//1-正在滑动,2滑动到最后一个,3是否加载完成
if(newState == RecyclerView.SCROLL_STATE_IDLE && lastIndex==countItem-1 && recyclerView1Adapter.isLoadComplet){
//进入加载的方法
recyclerView1Adapter.isLoadComplet = false;
//获取网络数据,加载更多的
initNet();
handler.sendEmptyMessageDelayed(1,2000l);
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}
public void initNet(){
for(int i=0;i<20;i++){
list.add(i+"");
}
}
public void initData(){
//设置分割线
// DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
// dividerItemDecoration.setDrawable(ContextCompat.getDrawable(this,R.drawable.recycler_divider));
// recyclerView.addItemDecoration(dividerItemDecoration);
//设置间距
// recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
// @Override
// public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// super.getItemOffsets(outRect, view, parent, state);
// outRect.bottom=100;
// outRect.left=100;
// }
// });
//动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
//线性布局方式的RecyclerView
//1-创建管理器LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//2-设置对齐方式
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//3-将管理器设置到recyclerView
recyclerView.setLayoutManager(linearLayoutManager);
//4-创建适配器
recyclerView1Adapter = new RecyclerView1Adapter(this,list);
recyclerView.setAdapter(recyclerView1Adapter);
}
}
代码注释得很清楚了,。就不多说了,。
接下来写适配器的布局,我们需要自定义一个头布局和底部布局,头部布局和底部布局的用法相同,。头部布局和底部布局很简单就不贴了,。我们直接写正文布局:就一个TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@drawable/recycler_background"
android:layout_height="wrap_content">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="60dp"
android:text="recyclerview1"
android:textColor="#000000" />
</LinearLayout>
现在写适配器的实现:
public class RecyclerView1Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private Context mContext;
private List<String> list;
public boolean isLoadComplet=true;//true默认是加载完成,可以执行加载
public RecyclerView1Adapter(Context mContext, List<String> list){
this.mContext = mContext;
this.list = list;
}
/**
* Item的ViewHolder
*/
class ItemHolder extends RecyclerView.ViewHolder{
TextView name;
public ItemHolder(View view){
super(view);
name =view.findViewById(R.id.name);
}
}
/**
* 头部的ViewHolder
*/
class HeaderHolder extends RecyclerView.ViewHolder{
public HeaderHolder(View view){
super(view);
}
}
/**
* 尾部的ViewHolder
*/
class FootHolder extends RecyclerView.ViewHolder{
public FootHolder(View view){
super(view);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
if(viewType==0){
view =LayoutInflater.from(mContext).inflate(R.layout.header_recycler,parent,false);
HeaderHolder headerHolder = new HeaderHolder(view);
return headerHolder;
}else if(viewType==1){
view =LayoutInflater.from(mContext).inflate(R.layout.footer_recycler,parent,false);
FootHolder footHolder = new FootHolder(view);
return footHolder;
}else{
view = LayoutInflater.from(mContext).inflate(R.layout.adapter_recyclerview1,parent,false);
ItemHolder itemHolder = new ItemHolder(view);
return itemHolder;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof HeaderHolder){
}else if(holder instanceof FootHolder){
}else{
ItemHolder itemHolder = (ItemHolder)holder;
itemHolder.name.setText(list.get(position));
itemHolder.name.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
list.remove(position);
notifyDataSetChanged();
View view =LayoutInflater.from(mContext).inflate(R.layout.header_recycler,null);
final PopupWindow popupWindow = new PopupWindow(view,ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);//把当前的所有事件都由popWindow处理
popupWindow.showAsDropDown(v,400,0);
Button button = view.findViewById(R.id.header_recycler_delete);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
list.remove(position);
notifyDataSetChanged();
popupWindow.dismiss();
}
});
return false;
}
});
}
}
@Override
public int getItemCount() {
return list.size();
}
public String getText(){
String text = "11111";
StringBuffer textSum=new StringBuffer();
Random random = new Random();
int i = random.nextInt(10)+1;
for(int j=0;j<i;j++){
textSum.append(text);
}
return textSum.toString();
}
@Override
public int getItemViewType(int position) {
if(position==0){
return 0;//头部
}else if(position+1==getItemCount()){
return 1;//尾部
}else{
return 2;//正常正文内容
}
}
}
就这些了,希望能帮助得到你,。一起进步,一起成长,。有不足的地方,请您指出,我会改进的,。

源码下载地址:https://download.youkuaiyun.com/download/weixin_42267745/10451079