最近项目里面有一个listview一键置顶,刷新加载,悬浮按钮功能,整理一下供大家参考
1、build.gradle中添加依赖
compile 'com.melnykov:floatingactionbutton:1.3.0'
2、布局文件(AutoSwipRefreshLayout是重写的android下的SwipeRefreshLayout 解决滑动冲突和增加自动刷新功能 )
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
xmlns:fab="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:background="@android:color/white"
android:layout_height="match_parent"
tools:context="com.burning.textlistview.MainActivity">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<com.burning.textlistview.AutoSwipRefreshLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="#ededed"
android:dividerHeight="1dp"
android:overScrollMode="never"
android:scrollbars="none" />
</com.burning.textlistview.AutoSwipRefreshLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.melnykov.fab.FloatingActionButton
android:id="@+id/fabs"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/fab"
android:layout_alignParentRight="true"
android:layout_marginRight="25dp"
android:alpha="0.8"
android:src="@mipmap/button_publish"
app:fab_colorDisabled="@android:color/transparent"
app:fab_colorNormal="@android:color/transparent"
app:fab_colorPressed="@android:color/transparent"
app:fab_colorRipple="@android:color/transparent"
fab:fab_shadow="false"
fab:fab_type="mini" />
<com.melnykov.fab.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_gravity="bottom|right"
android:layout_marginBottom="20sp"
android:layout_marginRight="25dp"
android:layout_marginTop="5dp"
android:alpha="0.8"
android:src="@mipmap/btn_top"
app:fab_colorDisabled="@android:color/transparent"
app:fab_colorNormal="@android:color/transparent"
app:fab_colorPressed="@android:color/transparent"
app:fab_colorRipple="@android:color/transparent"
fab:fab_shadow="false"
fab:fab_type="mini" />
</RelativeLayout>
</FrameLayout>
</LinearLayout>
3、SwipeRefreshLayout文件
package com.burning.textlistview;
import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class AutoSwipRefreshLayout extends SwipeRefreshLayout {
private float startY;
private float startX;
private int mTouchSlop;
// 记录viewPager是否拖拽的标记
private boolean mIsVpDragger;
public AutoSwipRefreshLayout(Context context) {
super(context);
}
public AutoSwipRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 记录手指按下的位置
startY = ev.getY();
startX = ev.getX();
// 初始化标记
mIsVpDragger = false;
break;
case MotionEvent.ACTION_MOVE:
// 如果viewpager正在拖拽中,那么不拦截它的事件,直接return false;
if (mIsVpDragger) {
return false;
}
// 获取当前手指位置
float endY = ev.getY();
float endX = ev.getX();
float distanceX = Math.abs(endX - startX);
float distanceY = Math.abs(endY - startY);
// 如果X轴位移大于Y轴位移,那么将事件交给viewPager处理。
if (distanceX > mTouchSlop && distanceX > distanceY) {
mIsVpDragger = true;
return false;
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
// 初始化标记
mIsVpDragger = false;
break;
}
// 如果是Y轴位移大于X轴,事件交给swipeRefreshLayout处理。
return super.onInterceptTouchEvent(ev);
}
/**
* 自动刷新
*/
public void autoRefresh() {
try {
Field mCircleView = SwipeRefreshLayout.class
.getDeclaredField("mCircleView");
mCircleView.setAccessible(true);
View progress = (View) mCircleView.get(this);
progress.setVisibility(VISIBLE);
Method setRefreshing = SwipeRefreshLayout.class.getDeclaredMethod(
"setRefreshing", boolean.class, boolean.class);
setRefreshing.setAccessible(true);
setRefreshing.invoke(this, true, true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4、添加listView滑动监听 实现上拉加载功能
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
if (view.getLastVisiblePosition() == view.getCount() - 1) {
footer.setVisibility(View.VISIBLE);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//上拉加载数据
footer.setVisibility(View.GONE);
getData();
}
}, 2000);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//int lastItem = firstVisibleItem + visibleItemCount - 1;
//判断当滑动item超多3个时 显示一键置顶按钮
if (firstVisibleItem > 3) {
fab.show();
fabs.show();
} else {
fab.hide();
fabs.hide();
}
}
});
5、设置悬浮按钮和listView关联
fab.attachToListView(listView, new ScrollDirectionListener() {
@Override
public void onScrollDown() {
fab.hide();
fabs.hide();
}
@Override
public void onScrollUp() {
fab.show();
fabs.show();
}
});
6、MainActivity所有代码
package com.burning.textlistview;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.Toast;
import com.melnykov.fab.FloatingActionButton;
import com.melnykov.fab.ScrollDirectionListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private List<String> lists;
private List<String> list;
private AutoSwipRefreshLayout layout;
private FloatingActionButton fab;
private FloatingActionButton fabs;
private Handler mHandler;
private ListView listView;
private View footer;
private DataAdapter dataAdapter;
private int j=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
getData();
}
private void initView(){
lists = new ArrayList<>();
for(int i=0;i<60;i++) {
lists.add("标题"+i);
}
list = new ArrayList<>();
mHandler = new Handler();
listView = (ListView)findViewById(R.id.listView);
footer = LayoutInflater.from(this).inflate(R.layout.footer,null);
listView.addFooterView(footer);
dataAdapter = new DataAdapter(list,this);
listView.setAdapter(dataAdapter);
layout = (AutoSwipRefreshLayout) findViewById(R.id.layout);
layout.setColorSchemeResources(R.color.colorPrimaryDark);
layout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
j=0;
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
getData();
}
}, 1000);
}
});
fab = (FloatingActionButton) findViewById(R.id.fab);
fabs = (FloatingActionButton) findViewById(R.id.fabs);
fabs.hide(false);
fab.hide(false);
fab.attachToListView(listView, new ScrollDirectionListener() {
@Override
public void onScrollDown() {
fab.hide();
fabs.hide();
}
@Override
public void onScrollUp() {
fab.show();
fabs.show();
}
});
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listView.smoothScrollToPosition(0);
// listView.setSelection(0);
}
});
fabs.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(list.size()==lists.size()){
Toast.makeText(MainActivity.this,"进入发布界面",Toast.LENGTH_SHORT).show();
}
}
});
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
if (view.getLastVisiblePosition() == view.getCount() - 1) {
footer.setVisibility(View.VISIBLE);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
//上拉加载数据
footer.setVisibility(View.GONE);
getData();
}
}, 2000);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//int lastItem = firstVisibleItem + visibleItemCount - 1;
if (firstVisibleItem > 3) {
fab.show();
fabs.show();
} else {
fab.hide();
fabs.hide();
}
}
});
}
private void getData(){
setData();
layout.setRefreshing(false);
if(list.size()==lists.size()){
Toast.makeText(this,"无更多数据",Toast.LENGTH_SHORT).show();
}
dataAdapter.notifyDataSetChanged();
}
private void setData(){
if(j==0){
list.clear();
}
for(int i=0;i<20;i++){
if(j<lists.size()){
list.add(lists.get(j));
}
j++;
}
}
}
7、FloatingActionButton源码demo 详细解释 GitHub地址
https://github.com/makovkastar/FloatingActionButton