自定义的Listview
package project.bridgetek.com.bridgelib.MyControl;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import project.bridgetek.com.bridgelib.R;
/**
* Created by czz on 19-5-7.
*/
public class MyListView extends ListView implements AbsListView.OnScrollListener {
private View footview;
private View headview;
private int totaItemCounts;
private int lasstVisible;
private int fistVisiable;
private LoadListener loadListener;
private int footViewHeight;
private int headViewHeight;
private int yload;
boolean isLoading;
private TextView updateInfo;
private TextView updateTime;
private ProgressBar progressBar;
private boolean up = false;
private boolean refresh = false;
public MyListView(Context context) {
super(context);
initView(context);
}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
//拿到头布局xml
headview = LayoutInflater.from(context).inflate(R.layout.head_layouyt, null);
updateInfo = (TextView) headview.findViewById(R.id.update_info);
//updateTime = (TextView) headview.findViewById(R.id.update_time);
progressBar = (ProgressBar) headview.findViewById(R.id.progressbar);
//updateTime.setText("更新于:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis()));
//拿到尾布局xml
footview = LayoutInflater.from(context).inflate(R.layout.footer_layout, null);
//测量footview的高度
footview.measure(0, 0);
//拿到高度
footViewHeight = footview.getMeasuredHeight();
//隐藏view
footview.setPadding(0, -footViewHeight, 0, 0);
headview.measure(0, 0);
headViewHeight = headview.getMeasuredHeight();
headview.setPadding(0, -headViewHeight, 0, 0);
//设置不可见
// footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
// headview.findViewById(R.id.head).setVisibility(View.GONE);
//添加到listview底部
this.addFooterView(footview);
//添加到listview头部
this.addHeaderView(headview);
//设置拉动监听
this.setOnScrollListener(this);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
yload = (int) ev.getY();
break;
case MotionEvent.ACTION_MOVE:
int moveY = (int) ev.getY();
Log.i("CONG", "onTouchEvent: " + yload + "?????/" + moveY);
int i = moveY - yload;
if (i > 0) {
up = false;
int paddingY = -headViewHeight + (moveY - yload) / 2;
if (paddingY < 0) {
updateInfo.setText("下拉刷新。。。");
progressBar.setVisibility(View.GONE);
refresh = false;
}
if (paddingY > 0) {
updateInfo.setText("松开刷新。。。");
progressBar.setVisibility(View.GONE);
refresh = true;
}
headview.setPadding(0, paddingY, 0, 0);
break;
} else {
up = true;
}
// case MotionEvent.ACTION_UP:
// headview.setPadding(0,0,0,0);
// updateInfo.setText("正在刷新。。。");
// progressBar.setVisibility(View.VISIBLE);
// loadListener.pullLoad();
//
// break;
}
return super.onTouchEvent(ev);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (up) {
if (totaItemCounts == lasstVisible && scrollState == SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading = true;
// footview.findViewById(R.id.foot_load).setVisibility(View.VISIBLE);
footview.setPadding(0, 0, 0, 0);
//加载数据
loadListener.onLoad();
}
}
} else {
if (refresh) {
if (fistVisiable == 0) {
headview.setPadding(0, 0, 0, 0);
updateInfo.setText("正在刷新。。。");
progressBar.setVisibility(View.VISIBLE);
loadListener.pullLoad();
}
} else {
loadComplete();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.fistVisiable = firstVisibleItem;
this.lasstVisible = firstVisibleItem + visibleItemCount;
this.totaItemCounts = totalItemCount;
}
//加载完成
public void loadComplete() {
isLoading = false;
//footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
footview.setPadding(0, -footViewHeight, 0, 0);
headview.setPadding(0, -headViewHeight, 0, 0);
}
public void setInterface(LoadListener loadListener) {
this.loadListener = loadListener;
}
//接口回调
public interface LoadListener {
void onLoad();
void pullLoad();
}
}
listv的头部视图
<?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="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/head"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="5dp">
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/update_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在刷新。。。。" />
</LinearLayout>
<!--<LinearLayout-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="wrap_content"-->
<!--android:gravity="center">-->
<!--<TextView-->
<!--android:id="@+id/update_time"-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content" />-->
<!--</LinearLayout>-->
</LinearLayout>
lisview的尾部视图:
<?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="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/foot_load"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:padding="5dp">
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加载中。。。。" />
</LinearLayout>
</LinearLayout>
activity或fragment中调用
1.实现接口。
public class DeviceSelectFragment extends Fragment implements MyListView.LoadListener
2.初始化
mLvDevice.setInterface(this);
3.实现上拉和下拉
@Override
public void onLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//加载完毕
mLvDevice.loadComplete();
}
},3000);
}
@Override
public void pullLoad() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//加载完毕
mLvDevice.loadComplete();
}
},3000);
}