2014-10-07 29 views
0

我有一個ExpandableListView,根據它們在組中的位置更改它的項目。下面的代碼在第一次繪製ListView時工作,但是當它重繪類似滾動的東西時,會使childPosition值發生更改。例如,如果我滾動到列表底部(隱藏第​​一個孩子)並向上滾動到頂部,getChildView將會將頂部視圖作爲最後一個孩子進行處理。不一致的ExpandableListView位置

說實話,位置值與屏幕上實際顯示的內容非常不一致。這是Android中的錯誤還是我在這裏錯過了一些東西?

作爲一個補充說明,當我將數據添加到這個ExpandableListView並根據groupPosition和childPosition值填充視圖(使用相同的功能),該數據是正確的......

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) get_context().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(rowFormatID, parent, false); 
    } 

    if(get_elementList().get(groupPosition).size()-1 == childPosition){ 
     View divider = v.findViewById(R.id.divider); 
     divider.setVisibility(View.GONE); 
    } 

    if (get_elementList().get(groupPosition).size() == 1) 
     v.setBackgroundResource(R.drawable.layer_card_background_white); 
    else { 
     if(childPosition == 0) 
      v.setBackgroundResource(R.drawable.layer_card_background_white_top); 
     else if(get_elementList().get(groupPosition).size()-1 == childPosition) 
      v.setBackgroundResource(R.drawable.layer_card_background_white_bottom); 
    } 
    return v; 
} 

編輯:下面是修復問題的調整代碼

@Override 
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) get_context().getSystemService 
       (Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(rowFormatID, parent, false); 
    } 

    View divider = v.findViewById(R.id.divider); 
    if(get_elementList().get(groupPosition).size()-1 == childPosition) 
     divider.setVisibility(View.GONE); 
    else //added this else 
     divider.setVisibility(View.VISIBLE); 


    if (get_elementList().get(groupPosition).size() == 1) 
     v.setBackgroundResource(R.drawable.layer_card_background_white); 
    else { 
     if(childPosition == 0) 
      v.setBackgroundResource(R.drawable.layer_card_background_white_top); 
     else if(get_elementList().get(groupPosition).size()-1 == childPosition) 
      v.setBackgroundResource(R.drawable.layer_card_background_white_bottom); 
     else //also added this else 
      v.setBackgroundColor(Color.WHITE); 
    } 
    return v; 
} 

回答

1

您並不總是設置您的視圖的內容。你應該總是完全初始化,可以更改所有的參數,因爲如果contentView != null你在未知狀態圖的情況下(這是從列表視圖中的一些其他位置的循環圖)

例如,你躲divider只有get_elementList().get(groupPosition).size()-1 == childPosition ,否則你什麼都不做。

與背景相同 - 如果沒有分支執行,則不會更改它。

+0

我不確定你的意思。列表的大小永遠不會改變(在這種情況下不會),所以它應該始終是靜態的。我需要完全初始化什麼? – c0deblooded 2014-10-08 12:35:15

+0

@ c0d3blooded例如在第二個if後寫'else {divider.setVisibility(View.VISIBLE);}'。在最後一個嵌套的'if':'else v.setBackgroundResource(R.drawable.whatever_default_background_you_have);'之後。 – 2014-10-08 13:10:51

+0

這些額外的檢查有點奇怪,但這樣做保持了一致的LivstView。謝謝一堆!我已經用調整後的代碼更新了我的答案。 – c0deblooded 2014-10-08 17:28:37

相關問題