我们都知道,SwipeRefreshLayout只支持下拉刷新功能,并没有上拉加载更多功能,那么如何实现它的上拉加载更多的功能呢?
上拉加载或者说滚动到底部时自动加载,都是通过判断是否滚动到了ListView或者其他View的底部,然后触发相应的操作.
我们以recyclerView为例,实现下拉刷新和上拉加载更多的功能.
代码:
MainActivity中:
import android.os.Handler;
import android.os.Message;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private SwipeRefreshLayout swipeRefreshLayout; private List<String> total=new ArrayList<>(); MyAdapter myAdapter; boolean isRefreshing; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 100://上拉加载更多 isRefreshing=false; total.remove(""); myAdapter.notifyDataSetChanged(); break; case 200://下拉刷新 isRefreshing=false; swipeRefreshLayout.setRefreshing(false); myAdapter.notifyDataSetChanged(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = (RecyclerView) findViewById(R.id.recyclerView); swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshView); final LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(manager); initData(); myAdapter= new MyAdapter(total, this); recyclerView.setAdapter(myAdapter); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); int lastVisibleItemPosition = manager.findLastVisibleItemPosition(); if (lastVisibleItemPosition==myAdapter.getItemCount()-1){ isRefreshing=swipeRefreshLayout.isRefreshing(); if (!isRefreshing){ isRefreshing=true; initData(); handler.sendEmptyMessageDelayed(100,3000); Toast.makeText(MainActivity.this, "已经是最后啦", Toast.LENGTH_SHORT).show(); } } } }); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { new Thread(){ @Override public void run() { super.run(); try { sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } total.clear(); initData(); handler.sendEmptyMessage(200); } }.start(); } }); } private void initData() { for (int i = 0; i < 20; i++) { total.add("苹果"+i); } total.add(""); }}
MyAdapter中:import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ private List<String> list; private Context context; private LayoutInflater inflater; private final int TYPE_FOOTER_VIEW=0; private final int TYPE_ITEM_VIEW=1; public MyAdapter(List<String> list, Context context) { this.list = list; this.context = context; inflater=LayoutInflater.from(context); } @Override public int getItemViewType(int position) { if (position==getItemCount()-1){ return TYPE_FOOTER_VIEW; } return TYPE_ITEM_VIEW; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType==TYPE_FOOTER_VIEW){ View view=inflater.inflate(R.layout.footer_layout,parent,false); return new MyFooterViewHolder(view); }else { View view=inflater.inflate(R.layout.item_layout,parent,false); return new MyViewHolder(view); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof MyViewHolder){ ((MyViewHolder) holder).item_tv.setText(list.get(position)); } } @Override public int getItemCount() { return list.size(); } //item的ViewHolder class MyViewHolder extends RecyclerView.ViewHolder{ TextView item_tv; public MyViewHolder(View itemView) { super(itemView); item_tv= (TextView) itemView.findViewById(R.id.item_tv); } } //foot的ViewHolder class MyFooterViewHolder extends RecyclerView.ViewHolder { public MyFooterViewHolder(View itemView) { super(itemView); } } } activity_main中:注:在数据源total中添加一个空的(total.add("")) 是为了给footView留一个位置,<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.pullrecyclerviewdemo.MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:layout_width="match_parent" android:id="@+id/swipeLayout" 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.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout> </RelativeLayout>
item_layout 中:<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:foreground="?android:attr/selectableItemBackground" app:cardElevation="10dp" app:cardCornerRadius="10dp" android:layout_margin="10dp" app:cardBackgroundColor="@android:color/holo_blue_light" > <TextView android:id="@+id/item_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_marginBottom="30dp" android:layout_marginTop="30dp" android:textColor="@android:color/white" android:layout_gravity="center" /> </android.support.v7.widget.CardView>
footer_layou中:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:gravity="center" android:layout_margin="10dp" android:text="加载更多" android:textSize="20sp" android:textColor="@android:color/black" /> </LinearLayout>
让footView显示,然后在加载更多完成后,把那条空的数据再移除(total.remove(""))