package com.example.formwork.view;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.LinearLayoutCompat;
import androidx.recyclerview.widget.RecyclerView;
import com.example.formwork.R;
public class RefrreshLayout extends FrameLayout {
public RefrreshLayout(@NonNull Context context) {
super(context);
}
public RefrreshLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public RefrreshLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
private ListView listView;
//xml文件生成点的时候
@Override
protected void onFinishInflate() {
super.onFinishInflate();
listView = (ListView) getChildAt(0);
// RecyclerView recyclerView = (RecyclerView) getChildAt(0);
// recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
// @Override
// public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
// super.onScrolled(recyclerView, dx, dy);
// if (recyclerView.canScrollVertically(1)){//底部
// isNeedLoad = true;
// }else {
// Toast.makeText(getContext(), "到底了", Toast.LENGTH_SHORT).show();
// isNeedLoad = false;
// }
//
// if (recyclerView.canScrollVertically(-1)){//顶部
// firstVisiblePosition = 0;
// }else {
// firstVisiblePosition =1;
// }
//
// }
// });
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
firstVisiblePosition = firstVisibleItem;
if (firstVisibleItem + visibleItemCount == listView.getCount()) {
isNeedLoad = true;
} else {
isNeedLoad = false;
}
}
});
initRefreshView();
initLoadingView();
}
private LinearLayout linearLayout;
private LinearLayout refreshLinearLayout;
private void initLoadingView() {
linearLayout = new LinearLayout(getContext());
linearLayout.setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
addView(linearLayout);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.refrreshlyout_view, null);
toptext = inflate.findViewById(R.id.top_text);
topprogess = inflate.findViewById(R.id.top_progess);
linearLayout.addView(inflate, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100));
linearLayout.setPadding(0, -100, 0, 0);
}
private TextView toptext;
private ProgressBar topprogess;
private int firstVisiblePosition;
private TextView bontext;
private ProgressBar bonprogess;
private boolean isNeedLoad = false;
private void initRefreshView() {
refreshLinearLayout = new LinearLayout(getContext());
refreshLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
refreshLinearLayout.setOrientation(LinearLayout.VERTICAL);
addView(refreshLinearLayout);
View inflate = LayoutInflater.from(getContext()).inflate(R.layout.refrreshlyout_view, null);
bontext = inflate.findViewById(R.id.top_text);
bonprogess = inflate.findViewById(R.id.top_progess);
bontext.setVisibility(View.INVISIBLE);
bonprogess.setVisibility(VISIBLE);
refreshLinearLayout.addView(inflate, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100));
refreshPaddingTop = getMeasuredHeight() - 100;
refreshLinearLayout.setPadding(0, refreshPaddingTop, 0, 0);
}
private int refreshPaddingTop;
private int oldY;
private float lastY, listListY, listListX;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
oldY = (int) ev.getY();
lastY = ev.getY();
listListX = listView.getX();
listListY = listView.getX();
break;
case MotionEvent.ACTION_MOVE:
if (ev.getY() > oldY && firstVisiblePosition == 0) {
return true;
} else if (isNeedLoad && ev.getY() < oldY) {
return true;
} else {
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
if (ev.getY() > lastY && ev.getY() - lastY <= 100) {
float diffy = ev.getY() - lastY;
float pTop = -100 + diffy;
linearLayout.setPadding(0, (int) pTop, 0, 0);
if (ev.getY() - lastY >= 50) {
toptext.setText("松手加载...");
} else {
toptext.setText("下拉加载...");
}
listView.scrollTo((int) listListX,-(int)(listListY+diffy));
} else if (isNeedLoad && lastY - ev.getY() <= 100) {
float loadDiffy = lastY - ev.getY();
refreshLinearLayout.setPadding(0, (int) (getMeasuredHeight() - loadDiffy), 0, 0);
}
break;
case MotionEvent.ACTION_UP:
if (ev.getY() - lastY >= 50) {
linearLayout.setPadding(0, 0, 0, 0);
topprogess.setVisibility(VISIBLE);
toptext.setVisibility(INVISIBLE);
if (iRefreshListener != null) {
iRefreshListener.onLoadMore();
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
linearLayout.setPadding(0, -100, 0, 0);
toptext.setVisibility(VISIBLE);
topprogess.setVisibility(INVISIBLE);
listView.scrollTo((int) listListX,(int) listListY);
}
}, 2000);
} else if (isNeedLoad && ev.getY() < lastY) {
Log.i("wpppppp", "onTouchEvent: "+(lastY - ev.getY()));
if (lastY - ev.getY() >50) {
Log.i("wpppppp", "onTouchEvent: if");
refreshLinearLayout.setPadding(0, getMeasuredHeight() - 100, 0, 0);
if (iRefreshListener!=null){
iRefreshListener.onRefresh();
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
refreshLinearLayout.setPadding(0, getMeasuredHeight() , 0, 0);
}
}, 2000);
} else {
Log.i("wpppppp", "onTouchEvent: else");
refreshLinearLayout.setPadding(0, getMeasuredHeight(), 0, 0);
}
} else {
linearLayout.setPadding(0, -100, 0, 0);
listView.scrollTo((int) listListX,(int) listListY);
}
break;
}
return true;
}
private IRefreshListener iRefreshListener;
public void addRefreshListener(IRefreshListener iRefreshListener) {
this.iRefreshListener = iRefreshListener;
}
public interface IRefreshListener {
void onRefresh();
void onLoadMore();
}
}
简单的自定义上拉加载
最新推荐文章于 2021-11-24 16:38:42 发布