使用SimpleAdapter访问listView的视图

问题描述:

在我的程序中,只要创建ListView并将Simpleadapter设置为适配器,我尝试访问此ListView中的视图以更改背景这个视图取决于一个条件。我用ListView.getChildAt(position)方法来做。但是,我得到一个nullPointer异常,我不明白为什么。这是我所关心的代码的一部分。 为了更好地理解下面的代码:我实际上在代码中创建了2个listView,Alarm是我实现的类。我只是通过这个课程获取一些信息。使用SimpleAdapter访问listView的视图

Java代码:

public class SmartAlarm extends AppCompatActivity { 
    private ListView list_view_alarms; 
    private ListView list_view_activates; 
    private List<HashMap<String, String>> listMapOfEachAlarm; 
    private List<HashMap<String, Integer>> listMapOfActivates; 
    private SimpleAdapter adapter_alarms; 
    private SimpleAdapter adapter_activates; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_smart_alarm); 
     list_view_alarms = (ListView) findViewById(R.id.list_alarm); 
     list_view_activates = (ListView) findViewById(R.id.list_activate); 
     listMapOfEachAlarm = new ArrayList<>(); 
     listMapOfActivates = new ArrayList<>(); 
     adapter_alarms = new SimpleAdapter(this, listMapOfEachAlarm, R.layout.item_alarm, 
new String[]{"alarm", "title"}, new int[]{R.id.time, R.id.title}); 
     adapter_activates = new SimpleAdapter(this, listMapOfActivates, R.layout.item_activate, new String[]{"alarm_drawable"}, new int[]{R.id.activate}); 
     for (Alarm alarm : alarmList) { 
      HashMap<String, String> mapOfTheNewAlarm = new HashMap<>(); 
      mapOfTheNewAlarm.put("alarm", alarm.getTime()); 
      mapOfTheNewAlarm.put("title", alarm.getTitle()); 
      listMapOfEachAlarm.add(mapOfTheNewAlarm); 
      HashMap<String, Integer> mapOfTheAlarmDrawable = new HashMap<>(); 
      if (alarm.getActivated()) { 
       mapOfTheAlarmDrawable.put("alarm_drawable", R.drawable.alarm_on); 
      } else { 
       mapOfTheAlarmDrawable.put("alarm_drawable", R.drawable.alarm_off); 
      } 
      listMapOfActivates.add(mapOfTheAlarmDrawable); 
     } 
     list_view_alarms.setAdapter(adapter_alarms); 
     list_view_activates.setAdapter(adapter_activates); 
     for(int i=0; i<list_view_alarms.getCount();i++) 
     { 
      if(conditionRespected()){ 
       list_view_alarms.getChildAt(i) 
        .setBackgroundColor(getResources().getColor (R.color.dark)); //The compilation error is here because list_view_alarms.getChildAt(i) is null 

      } 
     } 
    } 
} 

activity_smart_alarm.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/crazy_alarm" 
android:orientation="vertical" 
android:weightSum="10"> 

<CheckBox 
    android:id="@+id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="left" 
    android:text="Check the box if you want to activate the game" /> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ListView 
     android:id="@+id/list_alarm" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="8" 
     android:choiceMode="singleChoice" 
     android:divider="#FF0000" 
     android:dividerHeight="2dp" /> 

    <ListView 
     android:id="@+id/list_activate" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     android:choiceMode="singleChoice" 
     android:divider="#FF0000" 
     android:dividerHeight="2dp" /> 

</LinearLayout> 

</LinearLayout> 

对于感兴趣的人:要根据特定的条件改变listView中每个视图的背景,我终于覆盖了像这样的方法getView():

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     convertView = super.getView(position, convertView, parent); 
     if(condition){ 
      convertView.setBackgroundColor(getResources().getColor(R.color.dark)); 
     } 
     else 
     { 
      convertView.setBackgroundColor(getResources().getColor(R.color.bright)); 
     } 
     return convertView; 
    } 

你没有设置你的主要观点。您的列表视图必须在您的活动实际使用的视图内部创建。右内你onCreate()添加setContentView(R.layout.activity_main);

您还必须创建一个布局(在这种情况下activity_main)和你的ListView必须是activity_main布局

的孩子,这可能是你的activity_main样子

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    //and inside of here would be your listview 
    <android.support.v7.widget.ListViewCompat 
     android:id="@+id/list_alarm" 
     android:layout_width="" 
     android:layout_height=""></android.support.v7.widget.ListViewCompat> 

</RelativeLayout> 
+0

对不起,它已经完成了......我忘了将它复制到我的代码中......我刚刚完成了它 –

+0

所以你解决了你的问题?还是它还在破? – Rafa

+0

不,我的意思是我忘了将它复制到我放在这里的代码,在stackoverflow ...所以我仍然有问题当然:( –