【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);
相關文章
相關標籤/搜索