参考地址
https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
http://www.jianshu.com/p/9daaa87045d0
导包
compile 'com.android.support:appcompat-v7:24.2.1'//v7包
compile 'com.android.support:design:24.2.1'//包含recyclerView
compile 'in.srain.cube:ultra-ptr:1.0.11'//框架android-Ultra-Pull-To-Refresh
refresh_header.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/layout_tx">
<ImageView
android:id="@+id/iv_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_1" />
</FrameLayout>
<LinearLayout
android:id="@+id/layout_tx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_marginLeft="5dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="5dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="同一兴趣 统一交流"
android:textSize="14sp" />
<TextView
android:id="@+id/tv_remain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="松开刷新"
android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>
下拉刷新header
import android.content.Context;
import android.graphics.drawable.AnimationDrawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import in.srain.cube.views.ptr.PtrFrameLayout;
import in.srain.cube.views.ptr.PtrUIHandler;
import in.srain.cube.views.ptr.indicator.PtrIndicator;
/**
*
* Created by TONG on 2017/3/21.
*/
public class MyRefreshHeader extends FrameLayout implements PtrUIHandler {
/**
* 提醒文本
*/
private TextView mTvRemind;
/**
* logo
*/
private ImageView mIvMan;
/**
* 状态识别
*/
private int mState;
/**
* 重置
* 准备刷新
* 开始刷新
* 结束刷新
*/
public static final int STATE_RESET = -1;
public static final int STATE_PREPARE = 0;
public static final int STATE_BEGIN = 1;
public static final int STATE_FINISH = 2;
public static final int MARGIN_RIGHT = 100;
/**
* 动画
*/
private AnimationDrawable mAnimation;
public MyRefreshHeader(Context context) {
super(context);
initView();
}
public MyRefreshHeader(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MyRefreshHeader(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
/**
* 初始化view
*/
private void initView() {
View view = LayoutInflater.from(getContext()).inflate(R.layout.refresh_header, this, false);
mTvRemind = (TextView) view.findViewById(R.id.tv_remain);
mIvMan = (ImageView) view.findViewById(R.id.iv_header);
addView(view);
}
@Override
public void onUIReset(PtrFrameLayout frame) {
mState = STATE_RESET;
}
@Override
public void onUIRefreshPrepare(PtrFrameLayout frame) {
mState = STATE_PREPARE;
}
@Override
public void onUIRefreshBegin(PtrFrameLayout frame) {
mState = STATE_BEGIN;
//开启动画
mIvMan.setBackgroundResource(R.drawable.runningman);
mAnimation = (AnimationDrawable) mIvMan.getBackground();
if (!mAnimation.isRunning()) {
mAnimation.start();
}
}
@Override
public void onUIRefreshComplete(PtrFrameLayout frame) {
mState = STATE_FINISH;
//停止动画
if (mAnimation.isRunning()) {
mAnimation.stop();
}
mIvMan.setBackgroundResource(R.mipmap.ic_1);
}
@Override
public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch, byte status, PtrIndicator ptrIndicator) {
//处理提醒字体
switch (mState) {
case STATE_PREPARE:
//logo设置
mIvMan.setAlpha(ptrIndicator.getCurrentPercent());
LayoutParams mIvManLayoutParams = (LayoutParams) mIvMan.getLayoutParams();
if (ptrIndicator.getCurrentPercent() <= 1) {
mIvMan.setScaleX(ptrIndicator.getCurrentPercent());
mIvMan.setScaleY(ptrIndicator.getCurrentPercent());
int marginRight = (int) (MARGIN_RIGHT - MARGIN_RIGHT * ptrIndicator.getCurrentPercent());
mIvManLayoutParams.setMargins(0, 0, marginRight, 0);
mIvMan.setLayoutParams(mIvManLayoutParams);
}
if (ptrIndicator.getCurrentPercent() < 1.2) {
mTvRemind.setText("下拉刷新...");
} else {
mTvRemind.setText("松开刷新...");
}
break;
case STATE_BEGIN:
mTvRemind.setText("更新中...");
break;
case STATE_FINISH:
mTvRemind.setText("加载完成...");
break;
}
}
}
动画效果runningman.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/ic_1" android:duration="170" />
<item android:drawable="@mipmap/ic_2" android:duration="170" />
</animation-list>
MyRefreshLayout
import android.content.Context;
import android.util.AttributeSet;
import in.srain.cube.views.ptr.PtrFrameLayout;
/**
* Created by TONG on 2017/3/21.
*/
public class MyRefreshLayout extends PtrFrameLayout {
/**
* headerView
*/
MyRefreshHeader mHeaderView;
public MyRefreshLayout(Context context) {
super(context);
initView();
}
public MyRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public MyRefreshLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
/**
* 初始化view
*/
private void initView() {
mHeaderView = new MyRefreshHeader(getContext());
setHeaderView(mHeaderView);
addPtrUIHandler(mHeaderView);
}
}
activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/test_list_view_frame"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f0f0f0"
tools:showIn="@layout/activity_main">
<myapplication3.xt.com.myapplication.MyRefreshLayout
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/test_recycler_view_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
cube_ptr:ptr_duration_to_close="100"
cube_ptr:ptr_duration_to_close_header="500"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_resistance="2" >
<android.support.v7.widget.RecyclerView
android:id="@+id/test_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"/>
</myapplication3.xt.com.myapplication.MyRefreshLayout>
</FrameLayout>
MyAdapter
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import java.util.List;
/**
* Created by Administrator on 2016/12/5.
*/
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
/**
* 数据
*/
private List<Object> mDatas;
public MyAdapter(List<Object> datas) {
this.mDatas = datas;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(parent.getContext(), "good", Toast.LENGTH_SHORT).show();
}
});
return new RecyclerView.ViewHolder(view) {
};
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return mDatas.size();
}
}
MainActivity
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
import in.srain.cube.views.ptr.PtrDefaultHandler;
import in.srain.cube.views.ptr.PtrFrameLayout;
public class MainActivity extends AppCompatActivity {
/**
* 列表
*/
RecyclerView mRecyclerView;
/**
* 下拉刷新
*/
MyRefreshLayout mLayout;
/**
* 布局管理器
*/
RecyclerView.LayoutManager mManager;
/**
* 数据
*/
private List<Object> mDatas;
/**
* 适配器
*/
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDatas=new ArrayList<>();
for(int i=0;i<5;i++){
mDatas.add(new Object());
}
mLayout = (MyRefreshLayout) findViewById(R.id.test_recycler_view_frame);
mRecyclerView = (RecyclerView) findViewById(R.id.test_recycler_view);
mManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mManager);
mAdapter=new MyAdapter(mDatas);
mRecyclerView.setAdapter(mAdapter);
mLayout.setPtrHandler(new PtrDefaultHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
doSth();
}
});
}
/**
* demo
*/
private void doSth() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mDatas.clear();
for(int i=0;i<5;i++){
mDatas.add(new Object());
}
mAdapter.notifyDataSetChanged();
mLayout.refreshComplete();
}
}.execute();
}
}
运行效果
Paste_Image.png
Paste_Image.png
图片资源
ic_1.png
ic_2.png