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 <[email protected]> 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 <[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 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 <[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 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 [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
-~----------~----~----~----~------~----~------~--~---