2019独角兽企业重金招聘Python工程师标准>>>

  1. 处理空ListView

    之前在做空数据的时候,会在ListView同界面再放一个其它控件,然后在ListView数据为空时,将控件显示,有数据再隐藏。

    最近发现有方法直接处理: ListView处理空数据时,可用通过方法setEmptyView()来设置空数据布局

    看效果:
        

    代码如下:

    布局文件:

    <?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"><Buttonandroid:id="@+id/btn_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="有数据"/><Buttonandroid:id="@+id/btn_nodata"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="无数据"/><ListViewandroid:id="@+id/mListView"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView><!--ListView 数据为空时 显示下面默认的图片--><ImageViewandroid:id="@+id/empty_view"android:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/pic1"/>
    </LinearLayout>

    程序代码:

    private ListView mListView;private Button btn_data;private Button btn_nodata;private Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view);context = this;initView();}private void initView(){btn_data = (Button)findViewById(R.id.btn_data);btn_nodata = (Button)findViewById(R.id.btn_nodata);btn_data.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String[] datas = {"item1", "item2"};mListView.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, datas));}});btn_nodata.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String[] datas = {};mListView.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, datas));}});mListView = (ListView)findViewById(R.id.mListView);mListView.setEmptyView(findViewById(R.id.empty_view));}
  2. ListView滑动监听

    工作时间也不短了,一直忙着做项目,除了自己会的那点基础,有很多是多拼凑一段代码,西拼凑一段代码。

    常用就是到github上找开源库,直接使用。

    但是时间一长,遇到一些特殊需求,就很难搞定。所以,搞定原理还是很重要的。

    2.1 OnTouchListener事件

    OnTouchListener是View中的监听事件,
    通过监听ACTION_DOWN、ACTION_MOVE、ACTION_UP这三个事件发生时的坐标,就可以根据坐标判断用户滑动的方向,
    并在不同的事件中进行相应的逻辑处理,使用代码如下所示:

    mListView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()){case MotionEvent.ACTION_DOWN://触摸时操作break;case MotionEvent.ACTION_MOVE://移动时操作break;case MotionEvent.ACTION_UP://离开时操作break;}return false;}});

    2.2 OnScrollListener事件

    mListView.setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView absListView, int scrollState) {switch (scrollState){case SCROLL_STATE_IDLE://滑动停止时Log.d("Test", "SCROLL_STATE_IDLE");break;case SCROLL_STATE_TOUCH_SCROLL://正在滚动Log.d("Test", "SCROLL_STATE_TOUCH_SCROLL");break;case SCROLL_STATE_FLING://手指抛动时,即手指用力滑动//在离开后ListView由于惯性继续滑动/*** 当用户没有做手指抛动的状态时,这个方法只会回调2次,否则会回调3次,差别就是手指抛动的这个状态。* 通常情况下,我们会在这个方法中通过不同的状态来设置一些标志Flag,来区分不同的滑动状态,供其他方法处理。*/Log.d("Test", "SCROLL_STATE_FLING");break;}}/**** @param absListView* @param firstVisibleItem 当前能看见的第一个Item的ID(从0开始)* @param visibleItemCount 当前能看见的Item总数*                         这里需要注意的是,当前能看见的Item数,包括没有显示完整的Item,即显示一小半的Item也包括在内了。** @param totolItemCount 整个ListViewI 的item总数*/@Overridepublic void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totolItemCount) {//滚动时一直调用/*** 判断当前是否滚动到最后一行*/if(firstVisibleItem + visibleItemCount == totolItemCount&& totolItemCount > 0){//滚动到最后一行Log.d("Test", "滚动到最后一行");}/*** 判断滚动的方向*/if(firstVisibleItem > lastVisibleItemPosition){//上滑Log.d("Test", "上滑");}else if(firstVisibleItem < lastVisibleItemPosition){//下滑 Log.d("Test", "下滑");}lastVisibleItemPosition = firstVisibleItem;Log.d("Test", "onScroll");}});
  3. ListView常用拓展

    具有弹性的ListView:

    Android默认的ListView在滚动到顶端或者底端的时候,并没有很好的提示。

    在Android5.X中,添加了一个半月形的阴影效果。 滚动到顶部和底部继续往上或者往下滑动一段距离。

    ListView的源代码有这么一个方法: 有个 maxOverScrollY,默认值是0,只需要修改这个参数的值,就可以让ListView具有弹性了!

    /*** 控制滑动到边缘的处理方法* @param deltaX* @param deltaY* @param scrollX* @param scrollY* @param scrollRangeX* @param scrollRangeY* @param maxOverScrollX* @param maxOverScrollY* @param isTouchEvent* @return*/@Overrideprotected 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, maxOverScrollY,isTouchEvent);}

    修改后的方法:

    public class MListView extends ListView {int mMaxOverDistance = (int)getResources().getDisplayMetrics().density*50;public MListView(Context context) {super(context);}public MListView(Context context, AttributeSet attrs) {super(context, attrs);}public MListView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}/*** 控制滑动到边缘的处理方法* @param deltaX* @param deltaY* @param scrollX* @param scrollY* @param scrollRangeX* @param scrollRangeY* @param maxOverScrollX* @param maxOverScrollY* @param isTouchEvent* @return*/@Overrideprotected 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, maxOverScrollY,
    //                isTouchEvent);return super.overScrollBy(deltaX, deltaY,scrollX, scrollY,scrollRangeX, scrollRangeY,maxOverScrollX, mMaxOverDistance,isTouchEvent);}}

    就可以看到明显的弹性效果了!!!

    ListView + ToolBar

    ListView 向下滑动时,隐藏ToolBar,

    向上滑动时,显示ToolBar功能

    代码如下:

    public class ListViewWithTopShowOrHide extends Activity{private MListView mListView;private float mFirstY;private float mCurrentY;private float mTouchSlop;private int direction;//标识方向private boolean mShow = true;private List<String> datas = new ArrayList<String>();private ArrayAdapter adapter;private Context context;private ObjectAnimator animator;private Toolbar mToolbar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list_view_with_top_show_or_hide);context = this;mToolbar = (Toolbar)findViewById(R.id.mToolbar);mListView = (MListView)findViewById(R.id.mListView);//添加头部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)));mListView.addHeaderView(header);mListView.setOnTouchListener(myTouchListener);adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, datas);mListView.setAdapter(adapter);/*** 获取系统认为的最低滑动距离*/mTouchSlop = ViewConfiguration.get(this).getScaledTouchSlop();initData();}/*** 加载数据*/private void initData(){for(int i=0;i<20;i++){datas.add("item"+i);}adapter.notifyDataSetChanged();}private View.OnTouchListener myTouchListener = new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://触摸时操作mFirstY = event.getY();break;case MotionEvent.ACTION_MOVE:mCurrentY = event.getY();if(mCurrentY - mFirstY > mTouchSlop){direction = 0;//down}else if(mFirstY - mCurrentY > mTouchSlop){direction = 1;//up}if(direction == 1){//向上Log.d("mShow", "direction: 向上滑动"+direction+" mShow:"+mShow);if(mShow){mShow = !mShow;toolbarAnim(mShow);//隐藏}}else if(direction == 0){//向下Log.d("mShow", "direction:向下滑动"+direction+" mShow:"+mShow);if(!mShow){mShow = !mShow;toolbarAnim(mShow);//显示}}//移动时操作break;case MotionEvent.ACTION_UP://离开时操作break;}return false;}};/*** 是否显示toolbar* @param isshow*/private void toolbarAnim(boolean isshow){if(animator!=null && animator.isRunning()){animator.cancel();}if(isshow){//显示animator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), 0);}else {//隐藏animator = ObjectAnimator.ofFloat(mToolbar, "translationY", mToolbar.getTranslationY(), -mToolbar.getHeight());}animator.start();}
    }

    布局文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:app="http://schemas.android.com/apk/res-auto"><com.example.mydemo.widget.MListViewandroid:id="@+id/mListView"android:layout_width="match_parent"android:layout_height="wrap_content"></com.example.mydemo.widget.MListView><android.support.v7.widget.Toolbarandroid:id="@+id/mToolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:title="ListViewWithToolBar"android:background="@android:color/holo_blue_light"app:titleTextColor="@color/white"></android.support.v7.widget.Toolbar>
    </RelativeLayout>

    效果如图所示:

转载于:https://my.oschina.net/gabriel1215/blog/603760

【学习笔记】ListView初识相关推荐

  1. Hadoop学习笔记—4.初识MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个 编程模型 ,用以进行大数据量的计算.对于大 数据量的计算,通常采用的处理手法就是并行计算.但对许多开 ...

  2. ASM学习笔记1 - 初识ClassVistor ——以ClassReader的应用为例

    ASM学习笔记1 - 初识ClassVistor --以ClassReader的应用为例 1 ASM简介 什么是ASM? Java操纵类字节码的工具.是一个jar包. 如何使用? ASM提供两类API ...

  3. C语言学习笔记-P1 初识C语言(2)

    C语言学习笔记-P1 初识C语言(2) C语言学习笔记-P1 初识C语言(2) 一.常量 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.枚举常量 二.字符串+转义字 ...

  4. C语言学习笔记-P1 初识C语言(1)

    C语言学习笔记-P1 初识C语言(1) P1 初识C语言(1) 一.什么是C语言 1.定义 2.发展 二.第一个C语言程序 Hello World 三.数据类型 四.变量,常量 未完待续!!! P1 ...

  5. xilinx srio ip学习笔记之初识srio

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之初识srio 前言 IP 设置 总结 前言 因为工作原因,需要对rapidio 的协议进行了解, ...

  6. 吴恩达《机器学习》学习笔记一——初识机器学习

    吴恩达<机器学习>学习笔记一 一. 什么是机器学习? 二.监督学习 三.无监督学习 初识机器学习 这是个人学习吴恩达<机器学习>课程的一些笔记,供自己和大家学习提升.第一篇内容 ...

  7. android学习笔记----ListView和各种适配器简介

    学习笔记 目录 打气筒(LayoutInflater对象)介绍: ArrayAdapter用法: 关于具有自定义 ArrayAdapter 的示例应用见这里: SimpleAdapter用法: 关于L ...

  8. Android学习笔记-ListView

    今天主要是学习了ListView控件.先把代码粘一下. package com.eoeAndroid.list; import java.util.ArrayList; import java.uti ...

  9. 【人工智能学习笔记】初识人工智能

    文章目录 前言 一.人工智能的定义 二.人工智能的应用 1.计算机视觉技术 2.自然语言处理 3.其他具体应用举例 三.AI算法工程师主要工作流程 四.人工智能的基本概念 机器学习 有监督学习 VS ...

  10. C语言学习笔记之初识

    初识C语言 一.计算机和编程语言 1.初学者在学习c的时候,不仅会为语言本身的复杂而困惑,而且对其编程工具的选择同样困扰. 因为c语言出现的时间很早,而且在这么多年中也没有一个主要的组织对其编程工具进 ...

最新文章

  1. 科学互驳:大脑细胞活到老,长到老?
  2. pandas中DataFrame的apply()方法和applymap()方法,以及python内置函数map()
  3. 如何突破你的“内在阻力”,让你渴望多年的梦想都能达成,并创造超越想像极限的“全方位成功”?突破内在阻力全方位成功...
  4. yslow客户端性能测试
  5. FlashMapManager
  6. SQL Server 中关于EXCEPT和INTERSECT的使用方法
  7. ORACLE存储过程中计算某天所在周的周一和周日的方法
  8. mediacodec编解码少帧问题
  9. python入门11 元组tuple
  10. C#的set 和 get 方法
  11. 获取VS2012离线语言包
  12. 房地产开发如何选择最佳招标采购策略
  13. 短信API接口怎么调用
  14. 无人机pid调节顺口溜
  15. python中清除文件内容用什么函数_数据清洗的基本流程_怎样清除excel中的公式
  16. excel表格计算年龄_在Excel中计算年龄
  17. 淘宝线上线下“出淘”欲打造零售业航母
  18. 例举计算机网络连接的主要对象,《计算机网络技术基础教程》课后习题答案_刘四清版...
  19. js设计模式——组合模式
  20. 小红书数据监测,品牌方必看的笔记投放技巧!

热门文章

  1. 定时关机 v1.0(autoshut v1.0)
  2. SecureCRT 远程端中文乱码问题处理
  3. Spring MVC数据绑定和表单标签的应用(附带实例)
  4. C语言把文件空格删去,关于文件操作,碰到空格就换行
  5. 数据库练习题总题库选择判断简答操作题
  6. java gui中文变方块_150道Java面试基础题(含答案)
  7. android wear中国版,AndroidWear中国版App——小白上手指南
  8. PHP判断客户端协议类型是否为https
  9. 接口规范 12. 自动删除相关接口
  10. 厦门大学c语言上机答案,厦门大学C语言程序设计2016模拟题讲评及课程复习.pptx...