记录自己成长的点滴
我在接触Android开发的时候,项目就在这样写了。如今随着年龄的老去,积淀了一些见解
基础不多讲了,直接讲讲自己开发中遇到的一些心得
ListView之--------
ViewHolder
ViewHolder模式是ListView的一个提高效率的重要方法。它利用了视图缓存机制,避免了每次在调用getView()的时候都findViewById实例化,减少了一些不必要的实例化。这种模式已经没什么好说的了,它只需要在Adapter里定义一个内部类ViewHolder,并将布局中控件作为成员变量,在getView()的时候使用控件们。如下:
<pre name="code" class="java">public class MyAdapter extends BaseAdapter
{
public List<String> mData;
public LayoutInflater mInflater;
此处省略一百个字...
@Override
public View getView(int position,View view, ViewGroup parent)
{
ViewHolder holder == null;
//此处应该判断是否已经被创建
if(view == null )
{
holder = new ViewHolder();
//如果没有视图缓存,那么实例化一个出来,下面应该加在一个布局
view = mInflater.inflate(R.layout.xxx);
//接下来就是findVIewById没啥好说的
view.setTag(holder);
}
else
{
//通过tag找到缓存的布局
holder = (ViewHolder)view.getTag();
}
//下面设置布局中控件要显示的视图,省略
}
//此处是内部类ViewHolder,
}
据说这种模式会提高50%多的效率,尤其在低端机上明显。
下面,是一些ListView的方法
视图间的分割divider="@null"(不设置分割线),可使用color填充分割线
dividerHeight分割线高度(有时间我会加入RecyclerView里,添加分割线的方法)
滚动条scrollbars=“null”隐藏滚动时的滚动条
item点击变色:默认的点击颜色太难看
listSelector=“#00000000”或者listSelector=“@color...”
设置显示的item项
mListView.setSelection(position);
在类中使用
mListView.smoothScrollBy(distance,duration);
mListView.smoothScrollBy(offset);
mListView.smoothScrollToPosition(position);
动态改变ListView
mData.add(“xxx”);
mAdapter.notifyDataSetChanged();
空布局
mListView.setEmptyView(findViewByID(R.id.empty));
遍历所有item
for(int i = 0; i < mListView.getChildCount(); i ++)
{
View view = mListView.getChildAt(i);
}
{
View view = mListView.getChildAt(i);
}
滑动监听
OnTouchListener
监听ACTGION_DOWN,ACTION_MOVE,ACTION_UP这三个事件发生时的坐标,就可以根据坐标判断滑动方向。
OnScrollListener
OnScrollListener是AbsListView中的监听事件,它封装了很多与ListView相关的信息,使用起来更加灵活。其中有两个回调方法:onScrollStateChanged()和onScroll()。
onScrollStateChanged这个方法根据它的参数scrollState来决定其回调的次数,它有以下三种模式:
onScrollListener.SCROLL_STATE_IDLE:滚动停止的时候
onScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滚动的时候
onScrollListener.SCROLL_STATE_FLING:手指用力滑动时,由于惯性导致ListView继续滑动的状态
onScroll这个回调方法,会在滚动时一直回调,而方法中的
第二个参数firstVisibleItem:指的是当前能看见的第一个Item的ID(ID也是从0开始)
visibleItemCount指的是当前能看见的Item总数(当前能看见的Item,包括没有显示完整的Item)
totalItemCount指的是整个ListView里包含的Item总数。
原生的谷歌提供的控件真的非常丑陋,像IOS,在列表滑动完会有一个弹性的效果