> I'm trying to get the same behavior as Alarm Clock, where tapping on a > list row brings up an activity to edit the row, and the check box can > only be selected by tapping on the check box itself. I think that > precludes using multiple-choice mode for the list view, correct?
Indeed it does. ListView is not ready to do things like this really but a way to do it (much better than how it was done in AlarmClock) is to use a TouchDelegate for the checkbox. > > Jesse > > On Mar 11, 4:38 pm, "Romain Guy (Google)" <[email protected]> > wrote: >> Hi Jesse, >> >> You should **not** set individual click listeners on the list items. >> This will cause all sort of problems, like the ones you're seeing. The >> main reason behind that is that ListView handles clicks/long clicks on >> the items already. Instead you should use >> ListView.setOnItemClickListener(). >> >> On Mar 5, 6:54 pm, Jesse McGrew <[email protected]> wrote: >> >> > I have a list activity that creates a header row above the data rows >> > from the adapter. I want to receive click events when the user selects >> > the header or a data row (but my data rows have check boxes in them, >> > so this part is tricky). When I use the touch screen, I get this >> > expected behavior: >> >> > 1. Tapping on any row causes a click event and a dialog appears. >> > 2. Long-pressing on a data row causes a context menu to appear. >> > 3. Long-pressing on the header row does *not* show the context menu. >> >> > However, when I use the arrow keys (emulator) or trackball (G1), I get >> > this unexpected behavior: >> >> > 1. Selecting any row fails to cause any click events, even though the >> > row's appearance changes like it's being clicked. >> > 2. Long-pressing on the header row *does* show the context menu, which >> > I don't want. >> > 3. Occasionally, it doesn't focus the correct row when I move up or >> > down (e.g. it skips from the header to the last data row). >> >> > What am I doing wrong? >> >> > Jesse >> >> > (Complete project:http://hansprestige.com/android/DpadBug.zip) >> >> > ////////// DpadActivity.java ////////// >> >> > package com.hansprestige.DpadBug; >> >> > import android.app.AlertDialog; >> > import android.app.Dialog; >> > import android.app.ListActivity; >> > import android.os.Bundle; >> > import android.view.ContextMenu; >> > import android.view.View; >> > import android.view.ViewGroup; >> > import android.view.ContextMenu.ContextMenuInfo; >> > import android.view.View.OnClickListener; >> > import android.widget.ArrayAdapter; >> > import android.widget.ListView; >> >> > public class DpadBugActivity extends ListActivity { >> > private static final int DIALOG_TEST = 1; >> >> > private OnClickListener testListener = new OnClickListener() { >> > public void onClick(View v) { >> > showDialog(DIALOG_TEST); >> > } >> > }; >> >> > @Override >> > public void onCreate(Bundle savedInstanceState) { >> > super.onCreate(savedInstanceState); >> > setContentView(R.layout.main); >> >> > ListView lv = getListView(); >> > registerForContextMenu(lv); >> >> > findViewById(android.R.id.empty).setOnClickListener >> > (testListener); >> >> > View addItem = getLayoutInflater().inflate >> > (R.layout.list_header, >> > null, false); >> > addItem.setOnClickListener(testListener); >> > lv.addHeaderView(addItem); >> >> > fillData(); >> >> > } >> >> > private void fillData() >> > { >> > String[] items = new String[] { "Item A", "Item B", "Item C" }; >> > ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, >> > R.layout.list_row, R.id.TextView01, items) { >> > @Override >> > public View getView(int position, View convertView, >> > ViewGroup >> > parent) { >> > View v = super.getView(position, convertView, >> > parent); >> > v.setOnClickListener(testListener); >> > v.setLongClickable(true); >> > return v; >> > } >> > }; >> > setListAdapter(adapter); >> > } >> >> > @Override >> > protected Dialog onCreateDialog(int id) { >> > switch (id) { >> > case DIALOG_TEST: >> > return new AlertDialog.Builder(this) >> > .setTitle("Hello!") >> > .setPositiveButton("Close", null) >> > .create(); >> > } >> > return super.onCreateDialog(id); >> > } >> >> > @Override >> > public void onCreateContextMenu(ContextMenu menu, View v, >> > ContextMenuInfo menuInfo) { >> > super.onCreateContextMenu(menu, v, menuInfo); >> > menu.add("Context item"); >> > } >> >> > } >> >> > ////////// main.xml ////////// >> >> > <?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="fill_parent"> >> >> > <ListView android:id="@+id/android:list" >> > android:layout_width="fill_parent" >> > android:layout_height="fill_parent" >> > android:focusable="false" /> >> > <include android:id="@+id/android:empty" layout="@layout/ >> > list_header" /> >> > </LinearLayout> >> >> > ////////// list_header.xml ////////// >> >> > <?xml version="1.0" encoding="UTF-8"?> >> > <!-- This seems way too complicated, but the outer view's layout >> > params are apparently >> > ignored, so I don't see a simpler way to (1) center the text >> > vertically in a large >> > row and (2) make the background highlight fill the entire row. --> >> > <FrameLayout xmlns:android="http://schemas.android.com/apk/res/ >> > android" >> > android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:background="@android:drawable/menuitem_background" >> > android:focusable="true" >> > android:descendantFocusability="blocksDescendants"> >> > <FrameLayout android:layout_width="99999dip" >> > android:layout_height="50dip"> >> > <TextView android:text="List header view" >> > >> > android:textAppearance="?android:attr/textAppearanceLarge" >> > android:layout_gravity="center_vertical" >> > android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:paddingLeft="10dip"></TextView> >> > </FrameLayout> >> > </FrameLayout> >> >> > ////////// list_row.xml ////////// >> >> > <?xml version="1.0" encoding="UTF-8"?> >> > <RelativeLayout android:id="@+id/RelativeLayout01" >> > xmlns:android="http://schemas.android.com/apk/res/android" >> > android:clickable="true" >> > android:focusable="true" android:background="@drawable/ >> > android:menuitem_background" >> > android:layout_width="fill_parent" >> > android:layout_height="wrap_content" >> > android:descendantFocusability="blocksDescendants"> >> > <CheckBox android:layout_alignParentLeft="true" >> > android:layout_alignParentTop="true" >> > android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:id="@+id/CheckBox01" >> > android:layout_marginTop="1dip" >> > android:layout_marginRight="2.5dip" >> > android:layout_marginLeft="1dip"></CheckBox> >> > <TextView android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:layout_alignParentTop="true" >> > android:id="@+id/TextView01" >> > android:text="Top left" android:textStyle="bold" >> > android:layout_toRightOf="@+id/CheckBox01" >> > android:layout_marginTop="5dip" >> > android:focusable="false"></TextView> >> > <TextView android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:text="Bottom left" >> > android:layout_alignLeft="@+id/ >> > TextView01" >> > android:id="@+id/TextView02" >> > android:focusable="false" >> > android:layout_below="@+id/TextView01"></TextView> >> > <TextView android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:text="Top right" >> > android:layout_alignParentTop="true" >> > android:layout_alignParentRight="true" >> > android:id="@+id/TextView03" >> > android:textStyle="bold" >> > android:layout_marginRight="5dip" >> > android:layout_marginTop="5dip" >> > android:focusable="false"></ >> > TextView> >> > <TextView android:layout_width="wrap_content" >> > android:layout_height="wrap_content" >> > android:text="Bottom right" >> > android:id="@+id/TextView04" >> > android:layout_below="@+id/TextView03" >> > android:layout_alignRight="@ >> > +id/TextView03" >> > android:focusable="false"></TextView> >> > </RelativeLayout> > > > -- Romain Guy Android framework engineer [email protected] Note: please don't send private questions to me, as I don't have time to provide private support. All such questions should be posted on public forums, where I and others can see and answer them --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---

