2014-10-07 38 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