如何在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<String>(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方法,它将在该项目中调用其适当的值。