Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

Android之ListView

$
0
0

1、设置项目间分隔线

android:divider=“@android:color/darker_gray”// 图片也可以

android:dividerHeight=“10dp”

android:divider=“@null”// 把分隔线设置为透明

2、隐藏滚动条

android:scrollbars=“none”

3、取消ListView的Item点击效果

当点击ListView中的一项是,系统默认会出现一个点击效果,在Android 5.X上是一个波纹效果,而在Android 5.X之下的版本则是一个改变背景颜色的效果,但可以通过修改listSelector属性来取消点击后的回馈效果

android:liistSelector=”#00000000“

也可以使用Android自带的透明色来实现这一个效果

android:listSelector =“@android:color/transparent”

4、设置ListView需要显示在第几项

listView.setSelection(N)//N就是显示的Item的索引(从0开始)

比如添加数据后希望添加的数据总能显示出来,就可以使用该方法

5、遍历ListView中的所有Item

for(int i=0;i<mListView.getChildCount(); i++) {

View = mListView.getChildAt(i);

}

6、处理空ListView

通过setEmptyView(View view)方法可以给ListView设置一个在空数据下显示的默认提示,比如传进去一个ImageView

7、具有弹性的ListView

listView滚动到顶端(底端)可以下拉(上拉)一段距离然后弹上去(下去)

public class NewListView extends ListView {
    public NewListView(Context context) {
        super(context);
    }

    public NewListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public NewListView(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, 100, isTouchEvent);
    }
}
maxOverScrollY默认是0,maxOverScrollY改为可下拉(上拉)的距离即可

8、自动显示、隐藏布局的ListView

package com.example.listview1;

import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Toolbar mToolBar;
    private ListView mListView;
    private int mTouchSlop;
    private float mFirstY;
    private float mCurrentY;
    private final int DOWN = 0;
    private final int UP = 1;
    private int mDirection;
    private boolean mShow = true;
    private ObjectAnimator mAnimator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
        // 用ToolBar取代ActionBar
        setSupportActionBar(mToolBar);
        // 获取系统ActionBar的高度,也就是ToolBar的高度
        int actionBarHeight = mToolBar.getHeight();
        // 获取系统认为的最低华滑动距离
        mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();
        View header = new View(this);
        header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,
                actionBarHeight));
        mListView.addHeaderView(header);
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            list.add("" + i);
        }
        mListView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list));
        // 监听滑动事件
        mListView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.i("qqq", "onTouch: down");
                        mFirstY = event.getY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.i("qqq", "onTouch: move");
                        mCurrentY = event.getY();
                        if(mCurrentY - mFirstY > mTouchSlop) {
                            mDirection = DOWN;
                        } else if(mFirstY - mCurrentY > mTouchSlop) {
                            mDirection = UP;
                        }
                        if(mDirection == DOWN) {
                            if(!mShow) {
                                toolBarAnim(DOWN);
                                mShow = !mShow;
                            }
                        } else if(mDirection == UP) {
                            if(mShow) {
                                toolBarAnim(UP);
                                mShow = !mShow;
                            }
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.i("qqq", "onTouch: up");
                        break;
                }
                // 注意这里是return false;
                // 如果返回true,ToolBar的显示隐藏功能还是有的,但是ListView的滑动功能没了
                // 原因看博客《Android中View的事件分发机制》
                /*
                public boolean dispatchTouchEvent(MotionEvent event) {
                    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
                            mOnTouchListener.onTouch(this, event)) {
                        return true;
                    }
                    return onTouchEvent(event);
                }
                */
                return false;
            }
        });
    }

    private void toolBarAnim(int direction) {
        if(mAnimator != null && mAnimator.isRunning()) {
            mAnimator.cancel();
        }
        if(direction == DOWN) {
            mAnimator = ObjectAnimator.ofFloat(mToolBar, "translationY", mToolBar.getTranslationY(), 0);
        } else if(direction == UP) {
            mAnimator = ObjectAnimator.ofFloat(mToolBar, "translationY", mToolBar.getTranslationY(), -mToolBar.getHeight());
        }
        mAnimator.start();
    }

    private void initView() {
        mToolBar = (Toolbar) findViewById(R.id.id_toolBar);
        mListView = (ListView) findViewById(R.id.id_listView);
    }
}

上述代码使用了ToolBar,别忘记把Activity的主题声明为NoActionBar

 <activity android:name=".MainActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">

以下是布局,注意要使用v7下的toolBar,不然在5.0以下的版本无效

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.listview1.MainActivity">

    <ListView
        android:id="@+id/id_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:headerDividersEnabled="false"/>
    <android.support.v7.widget.Toolbar
        android:id="@+id/id_toolBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@android:color/holo_blue_light"/>
</RelativeLayout>








作者:Get_Better 发表于2016/12/10 18:08:07 原文链接
阅读:29 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>