【Android群英传】学习笔记(三·一)

本篇笔记中,笔者将记录在ListView的使用的技巧
虽然5.X时代,RecyclerView在不少地方都在逐渐取代ListView,但ListView的使用范围仍是很普遍的,它这万年老大哥的地位也不是轻易就能撼动的java


1、使用ViewHolder模式提升效率

ViewHolder模式充分利用ListView的视图缓存机制,避免了每次在调用getView()的时候都去经过findViewById()实例化控件,据测试,使用ViewHolder模式将提升50%以上的效率android

/**
 * Created by monsterLin on 2016/9/2.
 */

public class FriendsAdapter extends BaseAdapter {
    private List<Friend> friendList ;
    private Context mContext ;
    private LayoutInflater mInflater ;

    public FriendsAdapter(List<Friend> friendList, Context mContext) {
        this.friendList = friendList;
        this.mContext = mContext;
        mInflater=LayoutInflater.from(mContext);
    }

    @Override
    public int getCount() {
        return friendList.size();
    }

    @Override
    public Object getItem(int position) {
        return friendList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        FriendVHolder friendVHolder = null;
        //判断是否缓存
        if (convertView==null){
            friendVHolder=new FriendVHolder();
            //实例化布局
            convertView=mInflater.inflate(R.layout.item_friend,null);
            friendVHolder.item_friend_civ_photo= (CircleImageView) convertView.findViewById(R.id.item_friend_civ_photo);
            friendVHolder.item_friend_tv_nick= (TextView) convertView.findViewById(R.id.item_friend_tv_nick);
            friendVHolder.item_friend_tv_motto= (TextView) convertView.findViewById(R.id.item_friend_tv_motto);
            convertView.setTag(friendVHolder);

        }else {
            //经过tag找到缓存的布局
            friendVHolder= (FriendVHolder) convertView.getTag();
        }

        //设置布局中控件要显示的视图
        friendVHolder.item_friend_civ_photo.setImageResource(friendList.get(position).getResId());
        friendVHolder.item_friend_tv_nick.setText(friendList.get(position).getNick());
        friendVHolder.item_friend_tv_motto.setText(friendList.get(position).getMotto());

        return convertView;
    }

    public final class FriendVHolder{
        public CircleImageView item_friend_civ_photo;
        public TextView item_friend_tv_nick , item_friend_tv_motto;
    }
}

2、设置项目间的分割线

系统提供了dividerHeightdivider这两个属性帮助咱们实现这一功能缓存

android:divider="@color/colorAccent"
        android:dividerHeight="8dp"

特殊状况下,当设置分割线为以下代码时,就能够把分割线设置为透明了ide

android:divider="@null"

3、隐藏ListView的滚动条

能够经过设置scrollbars进行设置布局

android:scrollbars="none"

4、取消ListView的点击效果

在Android 5.X以上是一个水滴反馈的效果
在Android 5.X如下则是一个改变背景色的效果,但能够经过listSelector属性来取消掉点击后的回馈效果测试

android:listSelector="#00000000"

固然,也能够直接使用Android自带的透明色来实现这个效果this

android:listSelector="@android:color/transparent"

5、设置ListView要显示在第几项

ListView以Item为单位进行显示,默认显示在第一个Item,当须要指定显示的Item时,能够经过下面代码实现spa

listview.setSection(N);  //N就是须要显示的第N个Item

固然相似方法还有scrollTo ,是瞬间完成的移动。除此以前,还可使用以下代码实现平滑移动code

listview.smoothScrollBy( distance,  duration);
        listview.smoothScrollByOffset(offset);
        listview.smoothScrollToPosition(index);
相关文章
相关标签/搜索