1. 程式人生 > >Android面試題——ListView(二)

Android面試題——ListView(二)

Listview如何定位到指定位置

可以通過ListView提供的lv.setSelection(48);方法。

如何在ScrollView中如何嵌入ListView

通常情況下我們不會在ScrollView中巢狀ListView,但是如果面試官非讓我巢狀的話也是可以的。

在ScrollView新增一個ListView會導致listview控制元件顯示不全,通常只會顯示一條,這是因為兩個控制元件的滾動事件衝突導致。所以需要通過listview中的item數量去計算listview的顯示高度,從而使其完整展示,如下提供一個方法供大家參考。

lv = (ListView) findViewById(R.id.lv

);

      adapter = newMyAdapter();

      lv.setAdapter(adapter);

      setListViewHeightBasedOnChildren(lv);

----------------------------------------------------

public voidsetListViewHeightBasedOnChildren(ListView listView) {

      ListAdapter listAdapter = listView.getAdapter();

      if (listAdapter == null

) {

         return;

      }

      int totalHeight = 0;

      for (int i = 0; i < listAdapter.getCount();i++) {

         View listItem = listAdapter.getView(i, null,listView);

         listItem.measure(0, 0);

         totalHeight +=listItem.getMeasuredHeight();

}

      ViewGroup.LayoutParams params =listView.getLayoutParams();

      params.height =totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

      params.height += 5;// ifwithout this statement,the listview will be a

                      //little short 

      listView.setLayoutParams(params);

   }

ListView中如何優化圖片

圖片的優化策略比較多。

1、處理圖片的方式:

如果ListView中自定義的Item中有涉及到大量圖片的,一定要對圖片進行細心的處理,因為圖片佔的記憶體是ListView項中最頭疼的,處理圖片的方法大致有以下幾種:

①、不要直接拿路徑就去迴圈BitmapFactory.decodeFile;使用Options儲存圖片大小、不要載入圖片到記憶體去。

②、對圖片一定要經過邊界壓縮尤其是比較大的圖片,如果你的圖片是後臺伺服器處理好的那就不需要了

③、在ListView中取圖片時也不要直接拿個路徑去取圖片,而是以WeakReference(使用WeakReference代替強引用。比如可以使用WeakReference mContextRef)、SoftReference、WeakHashMap等的來儲存圖片資訊。

④、在getView中做圖片轉換時,產生的中間變數一定及時釋放

2、非同步載入圖片基本思想:

1)、 先從記憶體快取中獲取圖片顯示(記憶體緩衝)

2)、獲取不到的話從SD卡里獲取(SD卡緩衝)

3)、都獲取不到的話從網路下載圖片並儲存到SD卡同時加入記憶體並顯示(視情況看是否要顯示)

原理:

優化一:先從記憶體中載入,沒有則開啟執行緒從SD卡或網路中獲取,這裡注意從SD卡獲取圖片是放在子執行緒裡執行的,否則快速滑屏的話會不夠流暢。

優化二:於此同時,在adapter裡有個busy變數,表示listview是否處於滑動狀態,如果是滑動狀態則僅從記憶體中獲取圖片,沒有的話無需再開啟執行緒去外存或網路獲取圖片。

優化三:ImageLoader裡的執行緒使用了執行緒池,從而避免了過多執行緒頻繁建立和銷燬,如果每次總是new一個執行緒去執行這是非常不可取的,好一點的用的AsyncTask類,其實內部也是用到了執行緒池。在從網路獲取圖片時,先是將其儲存到sd卡,然後再載入到記憶體,這麼做的好處是在載入到記憶體時可以做個壓縮處理,以減少圖片所佔記憶體。

ListView中圖片錯位的問題是如何產生的

圖片錯位問題的本質源於我們的listview使用了快取convertView,假設一種場景,一個listview一屏顯示九個item,那麼在拉出第十個item的時候,事實上該item是重複使用了第一個item,也就是說在第一個item從網路中下載圖片並最終要顯示的時候,其實該item已經不在當前顯示區域內了,此時顯示的後果將可能在第十個item上輸出影象,這就導致了圖片錯位的問題。所以解決之道在於可見則顯示,不可見則不顯示。