使用 SimpleAdapter 访问 listView 的视图

Posted

技术标签:

【中文标题】使用 SimpleAdapter 访问 listView 的视图【英文标题】:Having access to a view of a listView with SimpleAdapter 【发布时间】:2018-02-08 17:18:47 【问题描述】:

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

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_
android:layout_
android:background="@drawable/crazy_alarm"
android:orientation="vertical"
android:weightSum="10">

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

<LinearLayout
    android:layout_
    android:layout_>

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

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

</LinearLayout>

</LinearLayout>

【问题讨论】:

【参考方案1】:

对于感兴趣的人:为了根据特定条件更改 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;
    

【讨论】:

【参考方案2】:

您没有设置主视图。您的列表视图必须在您的活动实际使用的视图内创建。在您的 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_
    android:layout_
    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_
        android:layout_></android.support.v7.widget.ListViewCompat>

</RelativeLayout>

【讨论】:

对不起,已经完成了……我忘了把它复制到我的代码中……我刚刚完成了 所以你解决了你的问题?还是它还在破裂? 不,我的意思是我忘了把它复制到我放在这里的代码中,在***上......所以我当然仍然有问题:( 啊。你能把你的activity_smart_alarm代码也贴在那里吗? 您的 LinearLayout 似乎没有 id。那是对的吗?如果那是偶然的,那么这可能就是您所缺少的。

以上是关于使用 SimpleAdapter 访问 listView 的视图的主要内容,如果未能解决你的问题,请参考以下文章

转载《SimpleAdapter的参数说明》

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

AndroidStudio中ListView的使用方法之SimpleAdapter适配器

无法使用 SimpleAdapter 刷新 ListView