MainActivity
package com.example.admin.recyclerviewtest;
import android.os.Handler;
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.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.admin.recyclerviewtest.refresh.MyRefreshRecyclerView;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
private SwipeRefreshLayout swipeRefreshLayout;
private MyRefreshRecyclerView recyclerView;
private List<String> integerList = new ArrayList<>();
private MyAdapter myAdapter;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
init();
}
private void init() {
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout);
recyclerView = (MyRefreshRecyclerView) findViewById(R.id.recycler);
myAdapter = new MyAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
swipeRefreshLayout.setColorSchemeResources(R.color.red,
R.color.orange,
R.color.green,
R.color.blue);
swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(true);
}
});
refresh();
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refresh();
}
});
recyclerView.setMyLoadListener(new MyRefreshRecyclerView.MyLoadListener() {
@Override
public void onLoadMore() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (integerList.size() > 25) {
recyclerView.setLoadMore(false);
} else {
int randomInt = new Random().nextInt(100);
integerList.add("上拉加载添加数字:" + randomInt);
myAdapter.notifyDataSetChanged();
recyclerView.setLoadMore(true);
}
}
}, 1000);
}
});
}
private void getData() {
// integerList.clear();
Random random = new Random();
for(int i=0;i<5;i++){
int randomInt = random.nextInt(100);
integerList.add(String.valueOf(randomInt));
}
}
private void refresh() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
getData();
recyclerView.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
}, 1500);
}
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_refresh_recycler, parent, false);
return new MyViewHolder(rootView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.txt.setText(integerList.get(position));
}
@Override
public int getItemCount() {
return integerList.size();
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView txt;
public MyViewHolder(View itemView) {
super(itemView);
txt = (TextView) itemView.findViewById(R.id.item_txt);
}
}
}
Adapter
package com.example.admin.recyclerviewtest.refresh;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.admin.recyclerviewtest.R;
/**
* Created by tangyangkai on 2017/1/4.
*/
public class MyRefreshAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private RecyclerView.Adapter adapter;
private View footerView;
public static final int NORMAL_VIEW_TYPE = 1;
public static final int FOOTER_VIEW_TYPE = 2;
public MyRefreshAdapter(RecyclerView.Adapter adapter) {
this.adapter = adapter;
}
@Override
public int getItemViewType(int position) {
if (position == getItemCount() - 1) {
return FOOTER_VIEW_TYPE;
}
return NORMAL_VIEW_TYPE;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == FOOTER_VIEW_TYPE) {
return new RecyclerView.ViewHolder(footerView) {};
// View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot, parent,false);
// return new FootViewHolder(view);
} else {
return adapter.onCreateViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position == getItemCount() - 1) {
return;
} else {
adapter.onBindViewHolder(holder, position);
}
}
@Override
public int getItemCount() {
return adapter.getItemCount() + 1;
}
public void addFooterView(View footerView) {
this.footerView = footerView;
}
static class FootViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
public FootViewHolder(View view) {
super(view);
tv = view.findViewById(R.id.tv_load);
}
}
}
recyclerview
package com.example.admin.recyclerviewtest.refresh;
import android.content.Context;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
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 com.example.admin.recyclerviewtest.R;
/**
* Created by tangyangkai on 2017/1/4.
*/
public class MyRefreshRecyclerView extends RecyclerView {
private MyRefreshAdapter myRefreshAdapter;
private MyLoadListener myLoadListener;
private boolean isLoadMore = true; //默认是可以向上滑动加载
private TextView tvLoad;
private View footView;
private ProgressBar progressBar;
private boolean isLoadComplete =false;
public void setMyLoadListener(MyLoadListener myLoadListener) {
this.myLoadListener = myLoadListener;
}
public MyRefreshRecyclerView(Context context) {
super(context);
init();
}
public MyRefreshRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public MyRefreshRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
this.addOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
//停止滚动时
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//获取最后一个完全显示Item的Position
int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();
int totalItemCount = manager.getItemCount();
// 判断是否滚动到底部,并且不在加载状态
if (lastVisibleItem == (totalItemCount - 1)&&isLoadMore) {
isLoadMore = false;
tvLoad.setText("正在加载...");
progressBar.setVisibility(VISIBLE);
footView.setVisibility(VISIBLE);
myLoadListener.onLoadMore();
}
}
}
/**
* 避免没有占满全屏,就显示加载
* dy >0 向上滚动
* dy<0 向下滚动
* dy==0 一般是列表数据没有占满全屏
* @param recyclerView
* @param dx
* @param dy
*/
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
isLoadMore = true;
} else if (dy <= 0) {
isLoadMore = false;
}
Log.d("testtest", "dx==" + dx + "dy==" + dy);
}
});
}
@Override
public void setAdapter(Adapter adapter) {
LinearLayout footerLayout = new LinearLayout(getContext());
footerLayout.setGravity(Gravity.CENTER);
footerLayout.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, 160));
LayoutInflater mInflater = LayoutInflater.from(getContext());
View view = mInflater.inflate(R.layout.item_foot, null);
tvLoad = (TextView) view.findViewById(R.id.tv_load);
progressBar = (ProgressBar) view.findViewById(R.id.progressBar);
footerLayout.addView(view);
footView = footerLayout;
footView.setVisibility(GONE);
myRefreshAdapter = new MyRefreshAdapter(adapter);
myRefreshAdapter.addFooterView(footView);
super.setAdapter(myRefreshAdapter);
}
public interface MyLoadListener {
void onLoadMore();
}
public void setLoadMore(boolean complete) {
if (complete) {
footView.setVisibility(GONE);
} else {
tvLoad.setText("已经全部加载完啦!");
progressBar.setVisibility(GONE);
myRefreshAdapter.notifyItemRemoved(myRefreshAdapter.getItemCount()+1);
}
isLoadComplete = complete;
}
}
github地址