尝试更改项目背景颜色时,Listview会崩溃应用

时间:2017-08-27 14:23:25

标签: android listview

我遇到了一个我理解但无法找到解决方案的问题。所以我有一个列表视图和一些项目。我想改变一个项目的背景颜色,这很有效,但当项目是小于屏幕的大小。当项目更多,我想更改一个不可见的项目的背景颜色时,应用程序崩溃。 这是一些代码:

 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

我阅读并尝试了很多东西,但没有任何帮助。另外,我认为问题来自屏幕旋转或者列表视图必须将位置存储在布尔值中,以便记住它们。 感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果要存储数据,则应使用State来处理此问题。无论如何,你得到这个错误的原因在于你得到了循环中项目的ID,但是listView中的项目从0开始索引并且增加1.所以你有5个项目,所以第5项你可以得到listView.getChildAt(4)

答案 1 :(得分:0)

你似乎对android ListView有误解。对于列表中的每个项目,他们实际上没有单独的单独视图。它们包含一些固定数量的视图,具体取决于ListView的高度,并在滚动时重复使用。因此,NullPointerException可能会listView.getChildAt(i),因为该职位可能没有任何孩子。

如果要更改某个位置的列表项的背景颜色,则需要在getView的{​​{1}}方法中进行。