Your ListView is only for display.
Your ListAdapter (in your case ArrayAdapter) is for getting and
manipulating the actual data. Only it's 'getView' method provides a
bridge between the data and the display-view...
Iterate over the elements in your ArrayAdapter to determine if one
item is selected or not. (Do not iterate over the elements (child-
views) of the ListView.)
Each element in your ArrayAdapter should have a way to tell you if it
is selected or not.
Currently you use this ArrayAdapter<String>. This (<String>) is not
enough. You need to know if a particular String in this adapter has
been selected or not at some point:
public class SelectableString {
public String soundTableName;
public boolean isSelected;
// Add this method, to avoid overriding getView in your
ArrayAdapter.
public String toString() {
return soundTableName;
}
}
and then have a ArrayAdapter<SelectableString> instead.
Then register an OnItemSelectedListener (or something similar) and
implement this one to get the proper SelectableString from your
ArrayAdapter and set the SelectableString's 'isSelected' element to
true or false.
Then, at other points in your code, you can just iterate over your
ArrayAdapter and query each SelectableString's 'isSelected' member to
check if it has been selected or not.
On Oct 7, 11:02 pm, KhanAzul <[email protected]> wrote:
> Thank you for your response, and I can understand your confusion.
> Yes, when I run this activity, my screen displays the title text, two
> items in my ListView (0 = "Big Sound", 1 = "Little Sound"), and the
> footer text. I can select either or both items, and when I press
> Back, I can step through my onPause (you are correct here, pardon my
> bad form) and watch the selection indices get saved to
> "selectedSounds" preference.
>
> From what I've observed through careful debugging, I'm not having any
> issues saving the selections. Nor am I having issues retrieving these
> selections from preferences, or setting the ArrayAdapter to my
> ListView. The breakdown occurs when I try to set these items as
> checked in the ListView when the activity starts back up.
>
> > Don't use 'getChildCount' and 'getChildAt' method to check your
> > preference-settings.
>
> What is the proper method? I think this is the crux of my question.
>
> Again, I appreciate the help. I think some further guidance is
> needed.
>
> On Oct 7, 3:30 pm, Streets Of Boston <[email protected]> wrote:
>
>
>
> > 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 <[email protected]> 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>- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---