如何在listactivity列表中的button列表中激活onListItemClick?

我有一个简单的ListActivity使用自定义ListAdapter生成列表中的意见。 通常情况下,ListAdapter只是用TextView填充视图,但现在我想在这里放一个button。

但是,我的理解和经验是,在列表项中放置一个可聚焦的视图可以防止在ListActivity单击列表项时触发onListItemClick()。 该button仍然在列表项中正常工作,但是当button以外的东西被按下时,我想onListItemClick被触发。

我怎样才能做这个工作?

正如我在以前的评论解决scheme中写的ImageFutton上的setFocusable(false)。

有更优雅的解决scheme尝试列表元素的根布局中添加android:descendantFocusability="blocksDescendants" 。 这将使点击onListItem成为可能和分别你可以处理button或ImageButton点击

希望它有帮助;)

干杯

我希望我能在这里帮忙。 我假设你有自定义布局的ListView项目,这个布局包括button和一些其他的意见 – 如TextView,ImageView或其他。 现在,您希望在点击button时触发不同的事件,并在点击其他事件时触发不同的事件。

您可以实现这一点,而不使用ListActivity的onListItemClick()。
这是你必须做的:

您正在使用自定义布局,所以可能您正在重写您的自定义适配器的getView()方法。 诀窍是为您的button设置不同的侦听器,并为整个视图(您的行)设置不同的侦听器。 看看这个例子:

 private class MyAdapter extends ArrayAdapter<String> implements OnClickListener { public MyAdapter(Context context, int resource, int textViewResourceId, List<String> objects) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { String text = getItem(position); if (null == convertView) { convertView = mInflater.inflate(R.layout.custom_row, null); } //take the Button and set listener. It will be invoked when you click the button. Button btn = (Button) convertView.findViewById(R.id.button); btn.setOnClickListener(this); //set the text... not important TextView tv = (TextView) convertView.findViewById(R.id.text); tv.setText(text); //!!! and this is the most important part: you are settin listener for the whole row convertView.setOnClickListener(new OnItemClickListener(position)); return convertView; } @Override public void onClick(View v) { Log.v(TAG, "Row button clicked"); } } 

你的OnItemClickListener类可以这样声明:

 private class OnItemClickListener implements OnClickListener{ private int mPosition; OnItemClickListener(int position){ mPosition = position; } @Override public void onClick(View arg0) { Log.v(TAG, "onItemClick at position" + mPosition); } } 

当然,你可能会添加更多的参数到OnItemClickListener的构造函数。
一个重要的事情 – 上面显示的getView的实现是非常丑陋的,通常你应该使用ViewHolder模式来避免findViewById调用..但是你可能已经知道了。
我的custom_row.xml文件是RelativeLayout,其中id为“button”的button,id为“text”的TextView和id为“image”的ImageView – 只是为了说清楚。
问候!

当自定义ListView包含可聚焦元素时,onListItemClick将不起作用(我认为这是预期的行为)。 只需从自定义视图中移除焦点,就可以实现:

例如:

 public class ExtendedCheckBoxListView extends LinearLayout { private TextView mText; private CheckBox mCheckBox; public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) { super(context); … mText.setFocusable(false); mText.setFocusableInTouchMode(false); mCheckBox.setFocusable(false); mCheckBox.setFocusableInTouchMode(false); … } } 

我有同样的问题:OnListItemClick没有解雇! [解决了]
这发生在扩展ListActivity的类上,
与内容TextBox和ListView嵌套到LinearLayout的ListActivity的布局
和另一个行布局(一个CheckBox和TextBox嵌套到LineraLayout中)。

这是代码:

res / layout / configpage.xml (主要用于ListActivity)

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/selection" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="pippo" /> <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="false" android:background="#aaFFaa" > </ListView> <LinearLayout> res/layout/row.xml (layout for single row) <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <CheckBox android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" **android:focusable="false"** **android:focusableInTouchMode="false"** /> <TextView android:id="@+id/testo" android:layout_width="wrap_content" android:layout_height="wrap_content" **android:focusable="false"** **android:focusableInTouchMode="false"** /> </LinearLayout> 

src /…/…/ ConfigPage.java

 public class ConfigPage extends ListActivity { TextView selection; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.configpage); // loaded from res/value/strings String[] azioni = getResources().getStringArray(R.array.ACTIONS); setListAdapter(new ArrayAdapter&lt;String&gt;(this, R.layout.row, R.id.testo, azioni)); selection = (TextView) findViewById(R.id.selection); } public void onListItemClick(ListView parent, View view, int position, long id) { selection.setText(" " + position); } } 

当我添加到row.xml时,这开始工作

  • android:focusable="false"
  • android:focusableInTouchMode="false"

我使用Eclipse 3.5.2
Android SDK 10.0.1
分SDK版本:3

我希望这是有帮助的
…对不起,我的英语:(

只需添加android:focusable="false"作为您的button的属性之一

我有与ToggleButton相同的问题。 经过半天,我的头撞墙,我终于解决了。 就像使用“android:focusable”一样,使可调焦视图变得不可调焦。 你也应该避免玩与列表行的可聚焦性和可点击性(我只是拼写单词),只是留下它们的默认值。

当然,现在您列表中的焦点视图是不可调焦的,使用键盘的用户可能会遇到问题,关注它们。 这不太可能是一个问题,但是如果你想编写100%完美无瑕的应用程序,可以使用onItemSelected事件来使所选行的元素为可聚焦的,并且先前select的行的元素不可聚焦。

  ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // When clicked, show a toast with the TextView text Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); 

我使用getListAdapter()。getItem(position)实例化一个Object来保存项目中的值

 MyPojo myPojo = getListAdapter().getItem(position); 

然后使用myPojo中的getter方法,它将在该项目中调用其适当的值。