2012-09-13 56 views
4

好吧,我試圖在更改它的數據後獲得我的listview高度,但它總是返回之前的高度,而不是實際的高度。在setadapter之後獲取ListView的高度

所以,當我設置setadapter,並獲得舊值。 如:

ActualHeight = 100 
Change data (filter) -> NewHeight = 60 
ListView.GetHeight still returns 100. 

Again 

ActualHeight = 60 
Change data (filter) -> NewHeight = 20 
ListView.GetHeight still returns 60. 

我正在使用的代碼是:

    int width, height = 0; 

        EditText edt_search; 
        ListView lv_marca; 

        List<Marca> list_marca  = new ArrayList<Marca>(); 
        List<Marca> list_marca_search = new ArrayList<Marca>(); 

        String text = edt_search.getText().toString(); 


        list_marca_search.clear(); 

        if(text.startsWith(".")){ 
         text = text.replace(".", ""); 
         for (Marca m : list_marca) { 
          if (String.valueOf(m.getCd_marca()).equals(text)){ 
           list_marca_search.add(m); 
          } 
         } 
        } else { 
         for (Marca m : lista_marca) { 
          if (m.getDs_marca().contains(text)){ 
           list_marca_search.add(m); 
          } 
         } 
        } 

        ArrayAdapter<Marca> adapter_marca = new CustomAdapter_Marca(MyDialog.this, R.layout.layout_consulta_estoque_marca_lista, list_marca_search); 

        lv_marca.setAdapter(adapter_marca); 

        int height_window = getWindowManager().getDefaultDisplay().getHeight(); 
        height    = lv_marca.getHeight() + getSupportActionBar().getHeight(); 

        if (height >= height_window) { 
         height = (int) (height_window * 0.95); 
        } 

        getWindow().setLayout(width, height); 

回答

13

好的,我找到了解決方案。

當我更改我的ListView中的SetAdapter時,我得到的測量高度意味着一條線,並乘以線數加上分隔線高度的線數。

下面是一個例子,我是怎麼做的,我不知道,如果是更好的辦法,但它完美^^:

ListView lv_marca; 

    lv_marca.setAdapter(adapter_marca); 

    int list_height = getListViewHeight(lv_marca); 



    private int getListViewHeight(ListView list) { 
      ListAdapter adapter = list.getAdapter(); 

      int listviewHeight = 0; 

      list.measure(MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED), 
         MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

      listviewHeight = list.getMeasuredHeight() * adapter.getCount() + (adapter.getCount() * list.getDividerHeight()); 

      return listviewHeight; 
    } 
+0

你的代碼沒有運行。請不要將無效的答案標記爲解決方案。刪除建議 – user1324936

+0

@ user1324936在推薦刪除之前,您應該更努力:它工作得很好。 – AlexS

+0

@Cechinel U代碼在2.3中,但在4.2和4.1我得到不同的高度請給我解決方案。 –

1

你將有一個OnHierarchyChangeListener添加到您的列表視圖,這樣你可以得到列表視圖時,新的高度值子項中添加或從列表中刪除:

lv_marca.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() 
{ 
    @Override 
    public void onChildViewRemoved(View parent, View child) 
    { 
     // This will give you the height when your new adapter contains 
     // lesser number of items than the previous one 
     int heightAfterItemRemoved=parent.getHeight(); 
     Log.i("list_view_height_change","Height after removing item : "+heightAfterItemRemoved); 
    } 

    @Override 
    public void onChildViewAdded(View parent, View child) 
    { 
     // This will give you the height when your new adapter contains 
     // greater number of items than the previous one 
     int heightAfterItemAdded=parent.getHeight(); 
     Log.i("list_view_height_change","Height after adding item : "+heightAfterItemAdded);     
    } 
}); 

有一個陷阱 - 這一點,如果你的列表視圖中的「layout_height」屬性設置爲「WRAP_CONTENT只會工作」。在這種情況下,列表視圖的高度分別隨着項目的添加或刪除而增加或減少。列表視圖的高度在列表視圖完全填充時達到最大值。如果向列表視圖添加更多項目,它將溢出並且可滾動,但高度值不會更改,因爲它已經佔用了其父視圖中的最大允許高度。


如果您將'layout_height'設置爲'fill_parent'或'match_parent',那麼列表視圖將從其一開始就佔據其父視圖中的最大允許高度,因此刪除或添加項目不會導致任何更改在它的高度。

+0

感謝,但它觸發很多次,我不希望它。我已經找到了解決方案 – Cechinel

+1

@Cechinel:很好,你找到了解決方案。請張貼它,以便對面臨類似問題的其他人有所幫助。 – sandyiscool

+1

好吧@sandyiscoll,我在等待時間回答我自己的帖子^^ – Cechinel