我遇到了一个我理解但无法找到解决方案的问题。所以我有一个列表视图和一些项目。我想改变一个项目的背景颜色,这很有效,但当项目是小于屏幕的大小。当项目更多,我想更改一个不可见的项目的背景颜色时,应用程序崩溃。 这是一些代码:
btnRefresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setItemRed(v);
}
});
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listData);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String name = adapterView.getItemAtPosition(i).toString();
Cursor data = myDB.getItemID(name);
int itemID = -1;
while(data.moveToNext()){
itemID = data.getInt(0);
}
if(itemID > -1){
Intent intent = new Intent(ViewElevators.this, ElevatorInfo.class);
intent.putExtra("id",itemID);
intent.putExtra("name",name);
startActivity(intent);
}
else{
toastMessage("No ID associated with that name");
}
}
});
和setItemRed(); :
public void setItemRed(View view) {
for (int i = 0; i <= myDB.getLastID(); i++) {
String date = myDB.getcol3(i);
if (date.equals("null")) {
} else {
String day = date.substring(0, 2);
String dayp = date.substring(0, 1);
int dayp1 = Integer.parseInt(dayp);
int day1 = 0;
if (dayp1 == 0) {
String dayone = date.substring(1, 2);
day1 = Integer.parseInt(dayone);
} else {
day1 = Integer.parseInt(day);
}
String currentDate = currentDate();
String currentDay = currentDate.substring(0, 2);
int currentDay1 = Integer.parseInt(currentDay);
if (date.length() == 10) {
if (day1 < currentDay1) {
listView.getChildAt(i).setBackgroundColor(Color.RED);
}
}
}
logcat:
E/AndroidRuntime(3486):
java.lang.NullPointerException: Attempt to invoke virtual method 'void
android.view.View.setBackgroundColor(int)' on a null object reference
我阅读并尝试了很多东西,但没有任何帮助。另外,我认为问题来自屏幕旋转或者列表视图必须将位置存储在布尔值中,以便记住它们。 感谢您的帮助!
答案 0 :(得分:0)
如果要存储数据,则应使用State
来处理此问题。无论如何,你得到这个错误的原因在于你得到了循环中项目的ID,但是listView中的项目从0开始索引并且增加1.所以你有5个项目,所以第5项你可以得到listView.getChildAt(4)
答案 1 :(得分:0)
你似乎对android ListView
有误解。对于列表中的每个项目,他们实际上没有单独的单独视图。它们包含一些固定数量的视图,具体取决于ListView
的高度,并在滚动时重复使用。因此,NullPointerException
可能会listView.getChildAt(i)
,因为该职位可能没有任何孩子。
如果要更改某个位置的列表项的背景颜色,则需要在getView
的{{1}}方法中进行。