2013-01-24 127 views
0

当我有一个ListView与集onItemClickListenerNullPointerException异常点击ListView项

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    // not important 
    if (!found) { 
     activity.addSelectedIngredient(ingred); 
     parent.getChildAt(position).setBackgroundColor(Color.parseColor("#ff99FE80")); 
    } else { 
     activity.removeSelectedIngredient(ingred); 
     parent.getChildAt(position).setBackgroundColor(Color.WHITE); 
    } 
} 

NullPointerException当父母还没有得到孩子在选定的位置(例如15)被抛出。为什么?如果元素可能不存在,如果她已经选择了它?

编辑:

if (!found) { 
    activity.addSelectedIngredient(ingred); 
    view.setBackgroundColor(Color.parseColor("#ff99FE80")); 
} else { 
    activity.removeSelectedIngredient(ingred); 
    view.setBackgroundColor(Color.WHITE); 
} 
+0

什么是'found'?当它不应该是报告错误吗?此外,尽可能多的诙谐的标题很有趣,它们是误导和无益的 – Grambot

+0

当发现选定的项目已被点击时'found'为'true',我必须将其背景变回白色。对不起,标题,但我忍不住发布它;) –

回答

3

getChildAt返回listView的孩子。 getChildAt位置与您的适配器位置不同。您可以在适配器中拥有1000个项目,并且由于视图正在重复使用,因此在listview中只有多个childView。

我想你应该改变

parent.getChildAt(position).setBackgroundColor(Color.WHITE); 

view.setBackgroundColor(Color.WHITE); 
+0

谢谢:)请你也解释我为什么当我选择例如第一项然后第11的背景颜色也改变了?滚动后的 –

+0

?第11项重用第一个项目视图。向我们展示您的新代码。 – Leonidos

+0

是的,滚动后。有没有办法改变只有一个项目的背景颜色? –

1

尝试,

if (!found) { 
    activity.addSelectedIngredient(ingred); 
    view.setBackgroundColor(Color.parseColor("#ff99FE80")); 
} else { 
    activity.removeSelectedIngredient(ingred); 
    view.setBackgroundColor(Color.WHITE); 
} 

说明: 所以发生了什么事是父有看法,但索引复位。所以你显然不知道哪个索引被分配给了你的元素,这取决于listview已兑现元素的现金。所以不应该让孩子看你应该使用视图。这与您刚刚单击的项目完全相同。

相关问题