您的位置:首页 > 其它

使用RecyclerView 和SwipeRefreshLayout实现上拉加载更多功能

2016-10-19 20:51 701 查看
   我们都知道,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中:
<?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="
ab74
@+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>


注:在数据源total中添加一个空的(total.add("")) 是为了给footView留一个位置,
让footView显示,然后在加载更多完成后,把那条空的数据再移除(total.remove(""))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐