Ultra-Pull-To-Refresh
效果图
文字有闪动的效果
消失的时候文字有坍塌的效果
使用步骤
1.导包
compile ‘in.srain.cube:ultra-ptr:1.0.11’
2.布局文件
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/ptrFrameLayout_main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView_main"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</in.srain.cube.views.ptr.PtrFrameLayout>
布局文件中用PtrFrameLayout包裹RecyclerView或者ListView
3.编写Java代码
MainActivity
public class MainActivity extends AppCompatActivity {
private Context mContext = this;//上下文
private PtrFrameLayout ptrFrameLayout_main;
private RecyclerView recyclerView_main;
private LinearLayoutManager linearLayoutManager;//RecyclerView的布局管理器
private RecyclerViewAdapter adapter = null;//适配器
private List<String> totalList = new ArrayList<>();//RecyclerView的数据源
private int length = 30;
private int lastVisibleItemPosition = 0;//最后一个可见条目的下标(position)
Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用初始化控件的方法
initView();
}
private void initView() {
//绑定PtrFrameLayout
ptrFrameLayout_main = (PtrFrameLayout) findViewById(R.id.ptrFrameLayout_main);
//绑定RecyclerView
recyclerView_main = (RecyclerView) findViewById(R.id.recyclerView_main);
//给RecyclerView设置布局管理器
linearLayoutManager = new LinearLayoutManager(
mContext, LinearLayoutManager.VERTICAL, false);
recyclerView_main.setLayoutManager(linearLayoutManager);
//调用加载数据的方法,给RecyclerView获取数据源
loadData();
//给RecyclerView设置适配器
adapter = new RecyclerViewAdapter(mContext, totalList);
recyclerView_main.setAdapter(adapter);
//使用PtrFrameLayout实现下拉刷新
//效果1:设置默认的经典的头视图
PtrClassicDefaultHeader defaultHeader = new PtrClassicDefaultHeader(mContext);
//效果2:特殊效果,目前只支持英文字符(闪动的文字Header:闪动文字效果的header)
StoreHouseHeader storeHouseHeader = new StoreHouseHeader(this);
//storeHouseHeader.setPadding(0, 30, 0, 0);
//设置背景颜色为黑色
storeHouseHeader.setBackgroundColor(Color.BLACK);
//设置文字的颜色为白色
storeHouseHeader.setTextColor(Color.WHITE);
// 文字只能是0-9,a-z不支持中文
storeHouseHeader.initWithString("loading...");
//设置头视图
ptrFrameLayout_main.setHeaderView(storeHouseHeader);
// 绑定UI与刷新状态的监听
ptrFrameLayout_main.addPtrUIHandler(storeHouseHeader);
// 添加刷新动作监听
ptrFrameLayout_main.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
//开启一个子线程,模拟网络访问
new Thread(new Runnable() {
@Override
public void run() {
try {
//让子线程睡两秒才让刷新图标消失
Thread.sleep(2000);
// 刷新完成,让刷新Loading消失
ptrFrameLayout_main.refreshComplete();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
//因为UltraPullToRefresh只能实现下拉刷新,所以上拉加载只有通过上拉加载RecyclerView来实现
recyclerView_main.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//通过线性布局管理器找到最后一个可见的item条目的下标(position)
lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//如果最后一个可见条目的下标(position)等于RecyclerView的长度&&当前的状态为停止滑动
if (lastVisibleItemPosition + 1 == adapter.getItemCount() && newState ==
RecyclerView.SCROLL_STATE_IDLE) {
Toast.makeText(mContext, "正在加载...", Toast.LENGTH_SHORT).show();
//长度加30
length += 30;
//重写加载数据
loadData();
//刷新
adapter.reloadRecyclerView(totalList, false);
}
}
});
}
/**
* 加载数据
*/
private void loadData() {
for (int i = 0; i < length; i++) {
totalList.add("titles" + i);
}
// 刷新完成,让刷新Loading消失
ptrFrameLayout_main.refreshComplete();
}
}
适配器
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context = null;//上下文
private List<String> list = new ArrayList<>();//数据源
private LayoutInflater inflater = null;//布局填充器
public RecyclerViewAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_recyclerview_main, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ViewHolder) {
ViewHolder viewHolder = (ViewHolder) holder;
viewHolder.textView_main_details.setText(list.get(position));
}
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView_main_details;
public ViewHolder(View convertView) {
super(convertView);
textView_main_details = ((TextView) convertView.findViewById(R.id.textView_main_details));
}
}
/**
* 刷新RecyclerView
* @param _list
* @param isClear
*/
public void reloadRecyclerView(List<String> _list, boolean isClear) {
if (isClear) {
list.clear();
}
list.addAll(_list);
notifyDataSetChanged();
}
}