Here is what I ended up with. Do you guys care to grade this on an A to F scale. I'm all of a sudden wondering when the startManagingCursor (c); is going to slam my cursor shut, rendering this code broken. I guess I could always read the Cursor into an Array and use that for my adapter. When does the crazy *stop*?
private void preCheck(ListView list) { // if an entry is in the database, check it SimpleCursorAdapter adapter = (SimpleCursorAdapter) list.getAdapter (); int rows = adapter.getCount(); for (int i = 0; i < rows; i++) { adapter.getCursor().moveToPosition(i); String clickedPK = adapter.getCursor().getString(0); Log.d("preCheck()", clickedPK); if (keyInStupidExtraDataBase()) { list.setItemChecked(2, true); } } } On Oct 27, 5:00 pm, stanlick <stanl...@gmail.com> wrote: > Thanks brothers -- > > I like the idea of the selected state of the data being in the > adapter, however, I'm not too excited about all the custom code for > such an obvious requirement! I am using a ListActivity subclass > configured as follows: > > setListAdapter(buildNameAdapter()); > ListView list = getListView(); > list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); > list.setOnItemClickListener(this); > preCheck(list); > > The adapter is a SimpleCursorAdapter instantiated as follows > > private ListAdapter buildNameAdapter() { > String[] PROJECTION = new String[] { Contacts.People._ID, > Contacts.PeopleColumns.NAME }; > Cursor c = managedQuery(Contacts.People.CONTENT_URI, > PROJECTION, > null, > null, Contacts.People.DEFAULT_SORT_ORDER); > > startManagingCursor(c); > adapter = new SimpleCursorAdapter(this, > > android.R.layout.simple_list_item_multiple_choice, c, > new String[] { Contacts.PeopleColumns.NAME }, > new int[] { android.R.id.text1 }); > return adapter; > } > > Where I stuck the adapter in the list and thought life would be good. > Now I am sitting here with my cursor blinking in the preCheck(...) > method wondering what the hell to do to have an entry(s) pre-checked! > It appears I can either loop through the adapter/list and manipulate > the list view (as per Mark) or muck around with the Cursor in order to > add a SelectableString custom type to the adapter *and* override > callback methods to check the entries which have their > (selectableString.isSelected()==true values. The basic idea of > wanting a list of items either checked/unchecked seems like one where > none of this hand-coding should be necessary. This all started when I > was looking for a way to add *one* extra checkbox to the basic contact > info! Now I'm writing myself a small mountain of code because > associating a single "extra" element with a contact is harder than > pulling teeth. > > Does it sound like I am disappointed? Didn't we put a man on the > moon? > > P.S. Thanks for the help you guys. Rolling up my sleeves now and > cracking open a cold brew. Perhaps I'll flip a coin on this one. > > Peace, > Scott > > On Oct 27, 10:57 am, Streets Of Boston <flyingdutc...@gmail.com> > wrote: > > > Put the data whether a checkbox of a list-item is selected inside the > > *adapter's* data, like my example i gave you in an earlier post > > (selectableString.isSelected). > > > If you want to pre-select a check-box of a list-item, set its > > corresponding element in the adapter (SelectableString) as selected > > (selectableString.isSelected = true). Then, if you want to show this > > on the screen, call notifyDatasetChanged() on your adatper. > > > If you implemented your adapter's getView correctly, you'd see the > > checkbox becoming checked. > > Example code (won't compile): > > > public MyAdapter extends BaseAdapter { > > private List<SelectableString> mData = new > > ArrayList<SelectableString>(); > > ... > > > // example methods. > > public void selectSoundTableItem(int position, boolean select) { > > mData.get(position).isSelected = select; > > notifyDatasetChanged(); > > } > > > public void setSoundData(Map<String,Integer> soundTable) { > > mData.clear(); > > for (String soundName : soundTable.keySet()) { > > SelectableString ss = new SelectableString(); > > ss.soundTableName = soundName; > > ss.soundId = soundTable.get(soundName); > > mData.add(ss); > > } > > notifyDatasetChanged(); > > } > > > public void preselectSoundData(SharedPreferences prefs) { > > String[] selectedSoundsArray = > > prefs.getString("selectedSounds", "").split(","); > > > for (SelectableString ss : mData) { > > ss.isSelected = false; > > } > > > for (int selI = 0; selI < selectedSoundsArray.length; selI++) { > > SelectableString ss = findItem(mData,selectedSoundsArray > > [selI]); > > ss.isSelected = true; > > } > > notifyDatasetChanged(); > > } > > > // below are the methods from BaseAdapter you need to implement: > > // getCount(), getItem(int position), etc. > > ... > > public Object getItem(int position) { > > return mData.get(position); > > } > > ... > > ... > > > // Called by your attached ListView when it's about to create/re- > > use a visible item. > > // The ListView calls this method. Your code should not call it. > > public View getView(int position, View convertView, ViewGroup > > parent) { > > ... // use convertView or create/inflate a new one when it's > > null. // > > ... > > > SelectableString ss = (SelectableString)getItem(position); > > > // may help you find back the soundTableItem in onClick methods > > by calling 'getTag()' > > convertView.setTag(new Integer(ss.soundId)); > > > String soundName = ss.soundName; > > TextView tv = (TextView)convertView.findViewById(R.id.textview); > > tv.setText(soundName); > > > boolean isSelected = ss.isSelected; > > CheckBox cb = (CheckBox)convertView.findViewById(R.id.checkbox); > > cb.setChecked(isSelected); > > > ... > > ... > > > return convertView; > > } > > ... > > > } > > > On Oct 26, 9:38 pm, stanlick <stanl...@gmail.com> wrote: > > > > Thanks Mark -- > > > > Doesn't this sort of violate the MVC pattern? Moreover, does it seem > > > odd to you that both the adapter and ListView have methods to cough up > > > a view? Pre-selecting check boxes is sure becoming a difficult-to-do > > > process! > > > > I am in the debugger and experimenting with how I might get the view > > > from the list as you suggested. > > > > I have tried > > > > list.getChildAt(0); which returned null > > > list.getItemAtPosition(0) which returned > > > android.content.contentresolver$cursorwrapperin...@4375e088 > > > list.getRootView() which returned > > > com.android.internal.policy.impl.phonewindow$decorv...@4375ac38 > > > > Can you throw me another clue? > > > > Scott > > > > On Oct 25, 4:02 pm, "Mark Murphy" <mmur...@commonsware.com> wrote: > > > > > > 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? > > > > > The View you got from your getView() call is being discarded. > > > > > Remember, *ListView* does the caching of rows. Since your requested a > > > > row > > > > outside of ListView, ListView doesn't know about it or use it. > > > > > Add your SimpleCursorAdapter to your ListView, then call > > > > setItemChecked() > > > > on the ListView to check your desired row, and see if that works. > > > > > -- > > > > Mark Murphy (a Commons Guy)http://commonsware.com > > > > Android App Developer > > > > Books:http://commonsware.com/books.html-Hidequoted 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 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 -~----------~----~----~----~------~----~------~--~---