SwipeRefreshLayout和RecyclerView实现下拉刷新和上拉加载

SwipeRefreshLayout本身是自带刷新功能的,所有我们只需要实现上拉加载即可。

思路:当RecyclerView滑动到底部时显示加载进度条

代码:

public class MainActivity extends AppCompatActivity {

private android.widget.LinearLayout linear;
private android.support.v7.widget.RecyclerView rv;
private android.support.v4.widget.SwipeRefreshLayout sw;
private Handler handler = new Handler();
private int page = 1;
private String path;
private List<FuLiBean.ResultsBean> list = new ArrayList<>();
private List<FuLiBean.ResultsBean> list1;
private MyRecycleViewAdapter myRecycleViewAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找控件
this.sw = (SwipeRefreshLayout) findViewById(R.id.sw);
this.rv = (RecyclerView) findViewById(R.id.rv);
this.linear = (LinearLayout) findViewById(R.id.linear);
//设置RecyclerView样式
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
rv.setLayoutManager(linearLayoutManager);
sw.setColorSchemeResources(android.R.color.holo_red_light, android.R.color.holo_blue_light,
android.R.color.holo_green_light, android.R.color.holo_orange_light);
getServiceData();
//SwipeRefreshLayout监听事件
sw.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
handler.postDelayed(new Runnable() {
@Override
public void run() {
list.clear();
page =1;
getServiceData();
sw.setRefreshing(false);
Toast.makeText(MainActivity.this, "刷新完成", Toast.LENGTH_SHORT).show();
}
}, 3000);
}
});
//RecyclerView滑动监听
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//获取最后一个可见的自子条目位置
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
//获取所有子条目总数
int itemCount = linearLayoutManager.getItemCount();
//判断是否滑动到底部
if (lastVisibleItemPosition == (itemCount - 1)) {
//如果到底部则显示加载更多
linear.setVisibility(View.VISIBLE);
handler.postDelayed(new Runnable() {
@Override
public void run() {
//加载完成后隐藏进度
linear.setVisibility(View.GONE);
page++;
getServiceData();
Toast.makeText(MainActivity.this, "加载完成", Toast.LENGTH_SHORT).show();
}
}, 3000);
}
}
});
}

//获取网络数据
private void getServiceData() {
path = "http://gank.io/api/data/%E7%A6%8F%E5%88%A9/10/" + page;
OkHttp3Utils.doGet(path, new GsonObjectCallback<FuLiBean>() {
@Override
public void onUi(FuLiBean fuLiBean) {
list1 = fuLiBean.getResults();
//遍历集合并把信息存到大的集合中
for (int i = 0; i < list1.size(); i++) {
list.add(list1.get(i));
}
//判断适配器是否为空,如果不为空则直接刷新,并使焦点停留在点击刷新的位置
if (myRecycleViewAdapter == null) {
myRecycleViewAdapter = new MyRecycleViewAdapter();
rv.setAdapter(myRecycleViewAdapter);
} else {
myRecycleViewAdapter.notifyDataSetChanged();
}
}

@Override
public void onFailed(Call call, IOException e) {

}
});
}

//自定义适配器
class MyRecycleViewAdapter extends RecyclerView.Adapter<MyViewHolder> {

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.show, parent, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Picasso.with(MainActivity.this).load(list.get(position).getUrl()).placeholder(R.mipmap.ic_launcher).into(holder.img);
holder.tv.setText(list.get(position).getType());
}

@Override
public int getItemCount() {
return list.size();
}
}

class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
ImageView img;

public MyViewHolder(View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
img = itemView.findViewById(R.id.img);
}
}
}


布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.swiperefreshlayoutstudy.MainActivity">


<LinearLayout
android:visibility="gone"
android:layout_alignParentBottom="true"
android:id="@+id/linear"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="50dp">
<ProgressBar
android:layout_weight="2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:textSize="16sp"
android:layout_weight="1"
android:gravity="center_vertical"
android:textColor="#f00"
android:text="正在加载更多数据"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/sw"
android:layout_above="@id/linear"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent">

</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
</RelativeLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值