感觉用到的次数无比多,要是要把它记下来,免得要用的时候又要重来一遍(个人记性太差)
先看效果图
接下来,说说要怎么写
1.首先在.gradle中添加一个jar包
gradle-wrapper.jar
2.在build.gradle添加依赖
compile ‘com.sch.rfview:AnimRefreshRecyclerView:1.0.6@aar’
compile ‘com.android.support:recyclerview-v7:24.0.0’
(recyclerview如果没有,要自己去下载的,这里我用的是24.0.0)
3.核心代码
Activity:
package com.example.administrator.sa.ListviewShangXia;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.example.administrator.sa.R;
/**
* listview的上下拉刷新,ok了
*/
public class ShangXiaActivity extends AppCompatActivity {
private LinearFragment linearFragment;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shang_xia);
linearFragment=new LinearFragment();
getFragmentManager().beginTransaction().replace(R.id.fragment_container,linearFragment).commit();
button= (Button) findViewById(R.id.list_shangxia);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().beginTransaction().setCustomAnimations(R.anim.translate_right_in,
R.anim.translate_left_out).replace(R.id.fragment_container, linearFragment).commit();
}
});
}
}
R.layout.activity_shang_xia
<?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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.sa.ListviewShangXia.ShangXiaActivity">
<Button
android:id="@+id/list_shangxia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="普通列表" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/list_shangxia" />
</RelativeLayout>
类LinearFragment
package com.example.administrator.sa.ListviewShangXia;
import android.app.Fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.administrator.sa.R;
import com.example.administrator.sa.ShangXiaShuaXin.DimensionConvert;
import com.sch.rfview.AnimRFRecyclerView;
import com.sch.rfview.decoration.DividerItemDecoration;
import com.sch.rfview.manager.AnimRFLinearLayoutManager;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class LinearFragment extends Fragment {
private AnimRFRecyclerView mRecyclerView;
private View headerView;
private View footerView;
private List<String> datas;
private Handler mHandler = new Handler();
public LinearFragment() {
// addData();
datas = new ArrayList<>();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (mRecyclerView == null) {
// 自定义的RecyclerView, 也可以在布局文件中正常使用
mRecyclerView = new AnimRFRecyclerView(getActivity());
// 头部
headerView = LayoutInflater.from(getActivity()).inflate(R.layout.header_view, null);
// 脚部
footerView = LayoutInflater.from(getActivity()).inflate(R.layout.footer_view, null);
// 使用重写后的线性布局管理器
AnimRFLinearLayoutManager manager = new AnimRFLinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(manager);
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), manager.getOrientation(), true));
// // 添加头部和脚部,如果不添加就使用默认的头部和脚部
// mRecyclerView.addHeaderView(headerView);
// // 设置头部的最大拉伸倍率,默认1.5f,必须写在setHeaderImage()之前
// mRecyclerView.setScaleRatio(1.7f);
// // 设置下拉时拉伸的图片,不设置就使用默认的
// mRecyclerView.setHeaderImage((ImageView) headerView.findViewById(R.id.iv_hander));
// mRecyclerView.addFootView(footerView);
// 设置刷新动画的颜色
mRecyclerView.setColor(Color.RED, Color.BLUE);
// 设置头部恢复动画的执行时间,默认500毫秒
mRecyclerView.setHeaderImageDurationMillis(300);
// 设置拉伸到最高时头部的透明度,默认0.5f
mRecyclerView.setHeaderImageMinAlpha(0.6f);
// 设置适配器
mRecyclerView.setAdapter(new MyAdapter());
// 设置刷新和加载更多数据的监听,分别在onRefresh()和onLoadMore()方法中执行刷新和加载更多操作
mRecyclerView.setLoadDataListener(new AnimRFRecyclerView.LoadDataListener() {
@Override
public void onRefresh() {
new Thread(new MyRunnable(true)).start();
}
@Override
public void onLoadMore() {
new Thread(new MyRunnable(false)).start();
}
});
// 刷新
mRecyclerView.setRefresh(true);
}
return mRecyclerView;
}
class MyRunnable implements Runnable {
boolean isRefresh;
public MyRunnable(boolean isRefresh) {
this.isRefresh = isRefresh;
}
@Override
public void run() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
if (isRefresh) {
newData();
refreshComplate();
// 刷新完成后调用,必须在UI线程中
mRecyclerView.refreshComplate();
} else {
addData();
loadMoreComplate();
// 加载更多完成后调用,必须在UI线程中
mRecyclerView.loadMoreComplate();
}
}
}, 2000);
}
}
public void refreshComplate() {
mRecyclerView.getAdapter().notifyDataSetChanged();
}
public void loadMoreComplate() {
mRecyclerView.getAdapter().notifyDataSetChanged();
}
/**
* 添加数据
*/
private void addData() {
for (int i = 0; i < 13; i++) {
datas.add("条目 " + (datas.size() + 1));
}
}
public void newData() {
datas.clear();
for (int i = 0; i < 13; i++) {
datas.add("刷新后条目 " + (datas.size() + 1));
}
}
private class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
TextView view = new TextView(getActivity());
view.setGravity(Gravity.CENTER);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
DimensionConvert.dip2px(getActivity(), 50)));
MyViewHolder mViewHolder = new MyViewHolder(view);
return mViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.mTextView.setText(datas.get(position));
}
@Override
public int getItemCount() {
return datas.size();
}
}
private class MyViewHolder extends RecyclerView.ViewHolder {
TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView;
}
}
}
类DimensionConvert
package com.example.administrator.sb.ListviewShangXiaShuaXin;
import android.content.Context;
/**
*
*/
public class DimensionConvert {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*
* @param context
* @param dpValue 要转换的dp值
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*
* @param context
* @param pxValue 要转换的px值
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}
layout中布局:
footer_view.xml
header_view.xml
anim中的布局:
translate_left_out.xml
translate_right_in.xml
布局代码:
footer_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<ProgressBar
style="@android:style/Widget.ProgressBar.Small"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载..." />
</LinearLayout>
header_view.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">
<ImageView
android:id="@+id/iv_hander"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="162dp"
android:src="@mipmap/banner1" />
</RelativeLayout>
translate_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:propertyName="x"
android:valueFrom="0"
android:valueTo="-720" />
</set>
translate_right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:propertyName="x"
android:valueFrom="720"
android:valueTo="0" />
</set>
写完了