自动隐藏、显示布局的listView

本文介绍了一种自定义ListView实现上下滑动时隐藏或显示Toolbar的方法,通过重写ListView的overscrollBy方法并结合触摸事件监听实现平滑过渡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先主页面布局如下:

注意添加了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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值