本篇筆記中,筆者將記錄在ListView的使用的技巧
雖然5.X時代,RecyclerView在不少地方都在逐漸取代ListView,但ListView的使用範圍仍是很普遍的,它這萬年老大哥的地位也不是輕易就能撼動的java
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; } }
系統提供了
dividerHeight
和divider
這兩個屬性幫助咱們實現這一功能緩存
android:divider="@color/colorAccent" android:dividerHeight="8dp"
特殊狀況下,當設置分割線爲以下代碼時,就能夠把分割線設置爲透明瞭ide
android:divider="@null"
能夠經過設置scrollbars進行設置佈局
android:scrollbars="none"
在Android 5.X以上是一個水滴反饋的效果
在Android 5.X如下則是一個改變背景色的效果,但能夠經過listSelector屬性來取消掉點擊後的回饋效果測試
android:listSelector="#00000000"
固然,也能夠直接使用Android自帶的透明色來實現這個效果this
android:listSelector="@android:color/transparent"
ListView以Item爲單位進行顯示,默認顯示在第一個Item,當須要指定顯示的Item時,能夠經過下面代碼實現spa
listview.setSection(N); //N就是須要顯示的第N個Item
固然相似方法還有scrollTo ,是瞬間完成的移動。除此以前,還可使用以下代碼實現平滑移動code
listview.smoothScrollBy( distance, duration); listview.smoothScrollByOffset(offset); listview.smoothScrollToPosition(index);