Your activity (and your list-view) is not yet visible in the onStart.

Don't use 'getChildCount' and 'getChildAt' method to check your
preference-settings.

BTW: If your activity is not yet visible, how can a user make a
selection?
Shouldn't you query in the onPause, for example.
And also, the positions returned by the method getCheckedItemPositions
() are the positions in your adapter (ArrayAdapter in your case). Your
list-*view* positions (used in getChildAt) are not the same. You list-
view will never have more children than the ones you can see. And the
child-at postion 0 is the one on the top of the list-view.

On Oct 7, 2:37 pm, KhanAzul <mark.pes...@gmail.com> wrote:
> 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