原地址:http://blog.csdn.net/lks1139230294/article/details/60762403
优: 1. OnItemClickListener 对item的点击事件能够很快相应,实现简单。 2. CursorAdapter 游标适配器能很方便与item数据绑定。 3. 能够在xml中轻松定义divider 缺: 1. item的动画,decoration与触摸交互实现起来困难
只需要调用Adapte的notifyDataChanged()方法,通知ListView更改数据源即可完成对ListView的动态修改(传进Adpater的需要是同一种数据)
可以通过监听View的监听事件OnTouchListener中的事件发生坐标来做相应的处理:
listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch(motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: //触摸时操作 Toast.makeText(ImgListActivity.this,"触摸",Toast.LENGTH_SHORT).show(); break; case MotionEvent.ACTION_MOVE: //移动时操作 Toast.makeText(ImgListActivity.this,"移动",Toast.LENGTH_SHORT).show(); break; case MotionEvent.ACTION_UP: //离开时操作 Toast.makeText(ImgListActivity.this,"离开",Toast.LENGTH_SHORT).show(); break; } return false; } }); 1234567891011121314151617181920 1234567891011121314151617181920另外还可以用AbsListView中的OnScrollListener来进行监听,封装了很多与ListView相关的信息,用起来更加灵活。
/AbsListView的onScrollListener listView.setOnScrollListener(new AbsListView.OnScrollListener() { //一般在此方法中设置Flag,标志状态,方便其他方法处理 @Override public void onScrollStateChanged(AbsListView absListView, int i) { switch(i){ case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: //活动停止时 Toast.makeText(ImgListActivity.this,"滑动停止",Toast.LENGTH_SHORT).show(); break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: //正在滑动时 Toast.makeText(ImgListActivity.this,"滑动停止",Toast.LENGTH_SHORT).show(); break; case AbsListView.OnScrollListener.SCROLL_STATE_FLING: //用力滑动时 Toast.makeText(ImgListActivity.this,"用力滑动",Toast.LENGTH_SHORT).show(); break; } } @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { //滑动时一直调用,可以根据后几个参数判断上滑还是下滑 } }); 123456789101112131415161718192021222324252627 123456789101112131415161718192021222324252627增加HeaderView或嵌套ScrollView,最简单的是重写ListView中的overScrollBy()方法,将maxOverScrollY参数修改成我们自己的就行了。为了适配分辨率问题,可以通过屏幕的density来计算具体的值,让不同分辨率的弹性基本保持一致:
//适配屏幕距离 private int mMaxOverScrollY; private void initDensity(Context context) { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); float density = metrics.density; mMaxOverScrollY = (int) (density * mMaxOverScrollY); } 12345678 12345678借助View的OnTouchListener接口来监听ListView的滑动,接着通过比较上次的坐标大小来判断上滑还是下滑。另外,为避免第一个item被ToolBar遮挡,首先要给ListView增加一个HeaderView:
//添加HeaderView View header = new View(this); header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,getActionBar().getHeight())); listView.addHeaderView(header); //判断滑动距离 listView.setOnTouchListener(new View.OnTouchListener() { private float mFirstY; private float mCurrentY; private boolean mShow; private int drection; //获取系统默认的最低滑动距离 int touchSlop = ViewConfiguration.get(this).getScaledTouchSlop(); @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)>touchSlop){ //下滑 drection=0; }else if((mFirstY-mCurrentY)>touchSlop){ //上滑 drection=1; } if(drection == 1){ //隐藏 if(mShow) { toolbarAnim(0); mShow = !mShow; } }else if(drection == 0){ //显示 if(!mShow){ toolbarAnim(1); mShow = !mShow; } } break; case MotionEvent.ACTION_UP: //离开时操作 Toast.makeText(ImgListActivity.this,"离开",Toast.LENGTH_SHORT).show(); break; } return false; } }); 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152一:使用convertView使用,listivew每次滚动都会调用gitview()方法,主要优化加载布局问题, 二:使用内部类ViewHolder新增加内部类ViewHolder,用于对控件的实力存储进行缓存,主要优化加载控件 三:google推荐优化,1+2实现 四:item布局不宜过深 五:对ListView中数据的分批及分页加载: 需求:ListView有一万条数据,如何显示;如果将十万条数据加载到内存,很消耗内存 解决办法: 优化查询的数据:先获取几条数据显示到界面上 进行分批处理—à优化了用户体验 进行分页处理—à优化了内存空间 说明: 一般数据都是从数据库中获取的,实现分批(分页)加载数据,就需要在对应的DAO中有相应的分批(分页)获取数据的方法,如findPartDatas () 1、准备数据: 在dao中添加分批加载数据的方法:findPartDatas () 在适配数据的时候,先加载第一批的数据,需要加载第二批的时候,设置监听检测何时加载第二批 2、设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener{….}) ①、在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和listView被滚动时调用的方法(onScroll) ②、在滚动状态发生改变的方法中,有三种状态: 手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动 惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔 静止状态: SCROLL_STATE_IDLE: // 静止 3、对不同的状态进行处理: 分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。
