I am using a SimpleCursorAdapter and having a similar problem with pre- checking certain entries. This is my experimental code that I am trying immediately following the instantiation of the adapter:
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_multiple_choice, c, new String[] { Contacts.PeopleColumns.NAME }, new int[] { android.R.id.text1 }); // TODO TEST CODE CheckedTextView cb = (CheckedTextView) adapter.getView(0, null, null); cb.setChecked(true); The list appears and the first entry is *not* checked. Any ideas? Thanks, Scott On Oct 8, 4:16 pm, Streets Of Boston <flyingdutc...@gmail.com> wrote: > YourListViewis 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 theListView.) > > 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 <mark.pes...@gmail.com> 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 myListView(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 theListViewwhen 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 <flyingdutc...@gmail.com> 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 <mark.pes...@gmail.com> wrote: > > > > > I want to display aListViewwith checkboxes, and I want some of the > > > > checkboxes pre-selected. TheListViewhas 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 > > > >ListViewreports 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{ > > > > ListViewlstSounds; > > > > 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" > > > > > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---