I want to display a ListView with checkboxes, and I want some of the
checkboxes pre-selected.  The ListView has setAdapter called during
onCreate, and the list information appears when the screen is drawn.
However, when I attempt to set certain list items as checked, my
ListView reports getChildCount() = 0.

My SharedPreferences contains a list of sounds that have been
previously selected, as a comma delimited string of list indices.
Because the list appears to have no children in onStart, my attempts
to set items as checked fails.

On the good side, once the list is rendered, I can select entries and
hit Back, and my selection is stored to SharedPreferences correctly.

How can I load my previous selection into the list?  Should I be using
something else here?

In the spirit of open source, here's my code, free to you :)

====================================================
SoundLibrary.Java
====================================================

import java.util.Hashtable;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class SoundLibrary extends Activity{
        ListView lstSounds;
        Hashtable<String, Integer> soundTable;
        CharSequence[] soundNames;
        CharSequence[] soundLocations;
        OnLongClickListener previewListener;
        static Context myContext;
        static MediaPlayer player;
        SharedPreferences prefs;

        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.soundlibrary);
        myContext = this.getApplicationContext();
        prefs = getSharedPreferences("myAppData", 0);

        soundTable = new Hashtable<String, Integer>();
        LoadSoundTable();
        lstSounds = (ListView)findViewById(R.id.lstSounds);
        PopulateSoundList();
        lstSounds.setOnLongClickListener(new PreviewListener());
        }

        @Override
        public void onStart() {
                super.onStart();
                String[] selectedSoundsArray =
                        prefs.getString("selectedSounds", "").split(",");
                for (int selI = 0; selI < selectedSoundsArray.length; selI++) {
                        if (lstSounds.getChildCount() <= selI) {
                                break;
                        }
                        try {
                                
lstSounds.getChildAt(Integer.parseInt(selectedSoundsArray
[selI])).setSelected(true);
                        } catch (NumberFormatException e) { }
                }
        }

        @Override
        public void onPause() {
                super.onPause();
                StringBuffer sb = new StringBuffer();
                SparseBooleanArray sbaSelectedSounds =
lstSounds.getCheckedItemPositions();
                for (int sbaKey = 0; sbaKey < sbaSelectedSounds.size(); 
sbaKey++)
                {
                        if (sbaSelectedSounds.get(sbaKey, false))
                        {
                                sb.append(String.valueOf(sbaKey));
                                sb.append(',');
                        }
                }
                prefs.edit().putString("selectedSounds", 
sb.toString()).commit();
        }

        private void LoadSoundTable()
        {
                Resources res = getResources();
                CharSequence[] soundNames =
                        res.getTextArray(R.array.sound_name);
                CharSequence[] soundLocations =
                        res.getTextArray(R.array.sound_location);

                for (int i = 0; i < soundNames.length; i++) {
                        soundTable.put(soundNames[i].toString(),
                                        
res.getIdentifier(soundLocations[i].toString(), "raw",
this.getPackageName()));
                }
        }

        private void PopulateSoundList()
        {
        ArrayAdapter<String> aa = new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_multiple_choice,
                        soundTable.keySet().toArray(new String[soundTable.keySet
().size()]));
        lstSounds.setAdapter(aa);
        }

        private class PreviewListener extends Activity implements
OnLongClickListener {
                public boolean onLongClick(View v) {
                        String previewSoundName = 
lstSounds.getSelectedItem().toString();
                        player = MediaPlayer.create(myContext,
                                        
soundTable.get(previewSoundName).intValue());
                player.start();
                return true;
                }
        }
}


====================================================
soundlibrary.xml - in res/layout
====================================================

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android";
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:orientation="vertical">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtTitle"
android:text="@string/sound_library_title"></TextView>

<ListView
android:id="@+id/lstSounds"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:choiceMode="multipleChoice"
android:clickable="true"
android:focusable="true"
android:longClickable="true"></ListView>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/txtPreview"
android:text="@string/sound_library_preview"></TextView>

</LinearLayout>


====================================================
sounds.xml  - in res/values
====================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
        <string-array name="sound_name">
                <item>Big Sound</item>
                <item>Little Sound</item>
        </string-array>
        <string-array name="sound_location">
                <item>test_big_sound</item>
                <item>test_little_sound</item>
        </string-array>
</resources>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to