日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Andorid ListView使用技巧

發(fā)布時(shí)間:2024/8/26 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Andorid ListView使用技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、使用ViewHolder模式提高效率

  ViewHolder模式充分利用ListView的視圖緩存機(jī)制,避免了每次在調(diào)用getView()方法的時(shí)候都去通過findViewById()方法實(shí)例化控件。使用ViewHolder模式,需要在自定義Adapter中定義一個(gè)內(nèi)部類ViewHolder,并將布局中的控件作為成員變量。起始時(shí),ListView創(chuàng)建的Cell條數(shù)量是當(dāng)前屏幕顯示的Cell條數(shù),在向上滾動(dòng)時(shí),新顯示的Cell是滾出屏幕的Cell的復(fù)用。與iOS的TableView的Cell優(yōu)化一樣。

1. 示例

1 public class ViewHolderAdapter extends BaseAdapter 2 { 3 private List<String> mData; 4 private LayoutInflater mInflater; 5 6 public ViewHolderAdapter(Context context, List<String> data) 7 { 8 mData = data; 9 mInflater = LayoutInflater.from(context); 10 } 11 12 @Override 13 public int getCount() 14 { 15 return mData.size(); 16 } 17 18 @Override 19 public Object getItem(int position) 20 { 21 return mData.get(position); 22 } 23 24 @Override 25 public long getItemId(int position) 26 { 27 return position; 28 } 29 30 @Override 31 public View getView(int position, View convertView, ViewGroup parent) 32 { 33 ViewHolder holder = null; 34 // 判斷是否緩存 35 if (convertView == null) 36 { 37 holder = new ViewHolder(); 38 // 通過LayoutInflater實(shí)例化布局 39 convertView = mInflater.inflate(R.layout.viewholder_item, null); 40 holder.mImgView = (ImageView) convertView.findViewById(R.id.icon); 41 holder.mTitle = (TextView) convertView.findViewById(R.id.title); 42 convertView.setTag(holder); 43 } 44 else 45 { 46 holder = (ViewHolder) convertView.getTag(); 47 } 48 49 holder.mImgView.setBackgroundResource(R.mipmap.ic_launcher); 50 holder.mTitle.setText(mData.get(position)); 51 52 return convertView; 53 } 54 55 public final class ViewHolder 56 { 57 public ImageView mImgView; 58 public TextView mTitle; 59 } 60 }

?

二、設(shè)置項(xiàng)目間分隔線

  系統(tǒng)提供了divider(顏色)和dividerHeight(高度)這兩個(gè)屬性實(shí)例ListView項(xiàng)目間分隔線。

1 android:divider="@android:color/darker_gray" 2 android:dividerHeight="10dp"

  設(shè)置透明分隔線:

1 android:divider="@null"

?

三、隱藏ListView的滾動(dòng)條

  ListView在滾動(dòng)時(shí),默認(rèn)在右側(cè)顯示滾動(dòng)條,可以通過scrollbars屬性設(shè)置不顯示滾動(dòng)條:

1 android:scrollbars="none"

?

四、取消ListView的Item點(diǎn)擊效果

  通過listSelector屬性設(shè)置Cell選中后的顏色:

1 android:listSelector="#000000"

  使用系統(tǒng)自帶的透明色來實(shí)現(xiàn):

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

?

五、動(dòng)態(tài)修改ListView

  ListView中的數(shù)據(jù)在某些情況下是需要變化的,當(dāng)然可以通過重新設(shè)置ListView的Adapter來更新ListView的顯示,但是,這需要重新獲取數(shù)據(jù),相當(dāng)于重新創(chuàng)建ListView。可以通過以下方法實(shí)現(xiàn)動(dòng)態(tài)更新ListView數(shù)據(jù)顯示:

1 mData.add("test"); 2 mHolderAdapter.notifyDataSetChanged();

  PS:當(dāng)修改了傳遞給Adapter的映射List之后,只需要通過調(diào)用Adapter的notifyDataSetChanged()方法,通過ListView更新數(shù)據(jù)源即可完成對(duì)ListView的動(dòng)態(tài)修改。

?

六、遍歷ListView中所有的Item

  ListView作為一個(gè)ViewGroup,提供了各種操縱子View的方法,最常用的就是通過getChildAt()方法獲取第i個(gè)子View,代碼如下所示:

1 for (int idx = 0; idx < mListView.getChildCount(); idx++) 2 { 3 View view = mListView.getChildAt(idx); 4 }

?

七、處理空ListView

  在列表無數(shù)據(jù)時(shí),ListView不顯示數(shù)據(jù)或者提示,ListView提供了setEmptyView()方法,通過這個(gè)方法可以給ListView設(shè)置一個(gè)空數(shù)據(jù)下顯示的默認(rèn)提示。代碼如下所示:

1 // list view 2 mListView = (ListView) findViewById(R.id.listview); 3 mHolderAdapter = new ViewHolderAdapter(this, mData); 4 mListView.setAdapter(mHolderAdapter); 5 // 獲取在空List時(shí),顯示的View 6 mNotDataView = (TextView) findViewById(R.id.emptyListview); 7 // 設(shè)置ListView在空數(shù)據(jù)時(shí),顯示的View 8 mListView.setEmptyView(mNotDataView);

?

八、ListView滑動(dòng)監(jiān)聽

  1.?OnTouchListener是View中的監(jiān)聽事件,通過監(jiān)聽ACTION_DOWN、ACTION_MOVE、ACTION_UP這三個(gè)事件發(fā)生時(shí)的坐標(biāo),就可以根據(jù)坐標(biāo)判斷用戶滑動(dòng)的方向:

1 mListView.setOnTouchListener(new View.OnTouchListener() 2 { 3 @Override 4 public boolean onTouch(View v, MotionEvent event) 5 { 6 switch (event.getAction()) 7 { 8 case MotionEvent.ACTION_DOWN: 9 { 10 // 觸摸時(shí)操作 11 Log.d(TAG, "Down"); 12 break; 13 } 14 case MotionEvent.ACTION_MOVE: 15 { 16 // 移動(dòng)時(shí)操作 17 Log.d(TAG, "Move"); 18 break; 19 } 20 case MotionEvent.ACTION_UP: 21 { 22 // 手指離開屏幕時(shí)操作 23 Log.d(TAG, "Up"); 24 break; 25 } 26 } 27 return false; 28 } 29 });

?

  2.?OnScrollListener是AbsListView中的監(jiān)聽事件,一般常用方法, 如下代碼所示:

1 mListView.setOnScrollListener(new AbsListView.OnScrollListener() 2 { 3 @Override 4 public void onScrollStateChanged(AbsListView view, int scrollState) 5 { 6 switch (scrollState) 7 { 8 case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: 9 { 10 // 滑動(dòng)停止時(shí) 11 Log.d(TAG, "SCROLL_STATE_IDLE"); 12 break; 13 } 14 case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: 15 { 16 // 正在滾動(dòng) 17 Log.d(TAG, "SCROLL_STATE_TOUCH_SCROLL"); 18 break; 19 } 20 case AbsListView.OnScrollListener.SCROLL_STATE_FLING: 21 { 22 // 手指拋開時(shí),即手指用力滑動(dòng),在離開后ListView由于慣性繼續(xù)滑動(dòng) 23 Log.d(TAG, "SCROLL_STATE_FLING"); 24 break; 25 } 26 } 27 } 28 29 int lastVisibleItemPosition = 0; 30 @Override 31 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 32 { 33 // 滾動(dòng)時(shí),一直調(diào)用 34 Log.d(TAG, "onScroll"); 35 36 // 判斷滾動(dòng)方向 37 if (firstVisibleItem > lastVisibleItemPosition) 38 { 39 // 向上滾動(dòng) 40 Log.d(TAG, "Scroll Up"); 41 } 42 else if (firstVisibleItem < lastVisibleItemPosition) 43 { 44 // 向下滾動(dòng) 45 Log.d(TAG, "Scroll Down"); 46 } 47 lastVisibleItemPosition = firstVisibleItem; 48 } 49 });

?

  • AbsListView.OnScrollListener.SCROLL_STATE_IDLE:滾動(dòng)停止時(shí)
  • AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:正在滾動(dòng);
  • AbsListView.OnScrollListener.SCROLL_STATE_FLING:手指拋開時(shí),即手指用力滑動(dòng),在離開后ListView由于慣性繼續(xù)滑動(dòng);

  在ListView滾動(dòng)時(shí)會(huì)一直回調(diào),而方法中的后三個(gè)int類型的參數(shù),則非常精確的顯示了當(dāng)前ListView滾動(dòng)的狀態(tài),這三個(gè)參數(shù)如下所示:

  • firstVisibleItem:當(dāng)前能看見的第一個(gè)Item的id(從0開始);
  • visibleItemCount:當(dāng)前能看見的Item個(gè)數(shù);
  • totalItemCount:當(dāng)前ListView的Item總數(shù);

  在ListView中還有一些其它的方法,如下代碼所示:

1 // 獲取可視區(qū)域內(nèi)最后一個(gè)Item的id 2 mListView.getLastVisiblePosition(); 3 // 獲取可視區(qū)域內(nèi)的第一個(gè)Item的id 4 mListView.getFirstVisiblePosition();

?

  

轉(zhuǎn)載于:https://www.cnblogs.com/naray/p/5627275.html

總結(jié)

以上是生活随笔為你收集整理的Andorid ListView使用技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。