首先主页面布局如下:
注意添加了toolbar ,通过获取list上下滑动的事件监听来决定toolbar是否显示
布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="mw.huawei.com.listview.MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolBar" android:background="#4097e6" android:layout_width="match_parent" android:layout_height="@dimen/abc_action_bar_default_height_material"> </android.support.v7.widget.Toolbar> <mw.huawei.com.listview.myListView android:id="@+id/listView" android:layout_width="wrap_content" android:layout_height="wrap_content"> </mw.huawei.com.listview.myListView> <Button android:text="add new data" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
自定义的ListView ,唯一添加了 overscrollBy方法,重写 maxOverScrollY 就可以像IOS那样,可以在向下拉动maxOverScrollY 一小段距离了
package mw.huawei.com.listview; import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * Created by Administrator on 2018/5/2. */ public class myListView extends ListView { public myListView(Context context) { super(context); } public myListView(Context context, AttributeSet attrs) { super(context, attrs); } public myListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, 130, isTouchEvent); } }
MainActivity 中主要对listView进行设置 滑动监听:
package mw.huawei.com.listview; import android.animation.ObjectAnimator; import android.app.Activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.Window; import android.widget.AbsListView; import android.widget.Button; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private List<String> mData = null; private Button btn; private ViewHolder adapter; private myListView listView; private float mFirstY; private int mTouchSlop; private ObjectAnimator animtor; private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //初始化数据 mData = new ArrayList<>(); for (int i=0;i<30;i++){ mData.add("number :" + i); } toolbar = (Toolbar) findViewById(R.id.toolBar); listView = (myListView) findViewById(R.id.listView); //设置listView header View header = new View(this); header.setLayoutParams( new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material))); listView.addHeaderView(header); adapter = new ViewHolder(mData,MainActivity.this); listView.setAdapter(adapter); listView.setOnTouchListener(myTouchListener); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mData.add("new data"); adapter.notifyDataSetChanged(); listView.setSelection(mData.size() -1); } }); // 获取系统认为的最小滑动距离 mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); } View.OnTouchListener myTouchListener = new View.OnTouchListener() { private boolean mShow = true; private int direction = -1; private float mCurrentY; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: mFirstY = motionEvent.getY(); break; case MotionEvent.ACTION_MOVE: mCurrentY = motionEvent.getY(); if (mCurrentY - mFirstY > mTouchSlop){ direction = 0; //向下滑动 }else if (mFirstY - mCurrentY > mTouchSlop){ direction = 1 ;// 向上滑动 } if (direction == 1){ if (mShow){ toolBarAnim(1);//隐藏 mShow = !mShow; } }else if (direction == 0){ if (!mShow){ toolBarAnim(0);// 显示 mShow = !mShow; } } break; case MotionEvent.ACTION_UP: break; } return false; } }; /** * ToolBar显示隐藏动画 * * */ private void toolBarAnim(int direction){ //开始新的动画之前要先取消以前的动画 if (animtor != null && animtor.isRunning()){ animtor.cancel(); } //toolbar.getTranslationY()获取的是Toolbar距离自己顶部的距离 float translationY=toolbar.getTranslationY(); if (direction ==0 ){ animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, 0); } else if (direction == 1){ animtor = ObjectAnimator.ofFloat(toolbar, "translationY", translationY, -toolbar.getHeight()); } animtor.start(); } }
BaseAdapter :
package mw.huawei.com.listview; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2018/5/2. */ public class ViewHolder extends BaseAdapter { private List<String> mData ; private LayoutInflater mInflater; public ViewHolder(List<String> mData, Context context){ this.mData = mData; mInflater = LayoutInflater.from(context); } @Override public int getCount() { return mData.size(); } @Override public Object getItem(int i) { return mData.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { Holder holder = null; if (view == null){ holder = new Holder(); view = mInflater.inflate(R.layout.list_item_layout,null); holder.imageView = (ImageView) view.findViewById(R.id.image); holder.textView = (TextView) view.findViewById(R.id.text); view.setTag(holder); }else{ holder = (Holder) view.getTag(); } holder.imageView.setBackgroundResource(R.mipmap.ic_launcher); holder.textView.setText(mData.get(i)); return view; } public final class Holder{ public ImageView imageView; public TextView textView; } }