Как запустить onListItemClick в Listactivity с помощью кнопок в списке?
У меня есть простая ListActivity, которая использует собственный ListAdapter для создания представлений в списке. Обычно ListAdapter просто заполняет представления TextViews, но теперь я хочу также добавить туда кнопку.
Однако я понимаю и опыт, что включение фокусного представления в элемент списка предотвращает запуск onListItemClick() в ListActivity при щелчке элемента списка. Кнопка все еще функционирует нормально в элементе списка, но когда что-то, кроме кнопки, нажата, я хочу, чтобы активировался onListItemClick.
Как я могу сделать эту работу?
Ответы
Ответ 1
как я писал в предыдущем комментарии, это решение setFocusable (false) в ImageButton.
Еще более элегантное решение пытается добавить android:descendantFocusability="blocksDescendants"
в корневой макет элемента списка. Это сделает клики onListItem возможными, и по отдельности вы можете обрабатывать клики Button или ImageButton
Надеюсь, что это поможет;)
Приветствия
Ответ 2
Надеюсь, я могу помочь здесь. Я предполагаю, что у вас есть настраиваемый макет для элементов listView, и этот макет состоит из кнопки и некоторых других представлений - например TextView, ImageView или любого другого. Теперь вы хотите, чтобы разные события запускались при нажатии кнопки, а другое событие срабатывало по всем остальным щелчкам.
Вы можете достичь этого, не используя onListItemClick() вашего ListActivity.
Вот что вам нужно сделать:
Вы используете настраиваемый макет, поэтому, вероятно, вы переопределяете метод getView() из вашего настраиваемого адаптера. Хитрость заключается в том, чтобы установить разные слушатели для вашей кнопки и разные для всего представления (вашей строки). Взгляните на пример:
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", TextView идентификатора "text" и ImageView id "image" - просто для того, чтобы все было ясно.
Привет!
Ответ 3
Когда пользовательский 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);
…
}
}
Ответ 4
У меня такая же проблема: OnListItemClick не уволен! [решено]
Это происходит в классе, расширяющем ListActivity,
с макетом для ListActivity, что содержимое TextBox и ListView вложены в LinearLayout
и другой макет для строк (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
Надеюсь, это полезно
... и извините за мой английский:(
Ответ 5
просто добавьте android:focusable="false"
в качестве одного из атрибутов вашей кнопки
Ответ 6
У меня была та же проблема с ToggleButton. Через полдня, ударив головой о стену, я наконец решил ее.
Это так же просто, как сделать фокусируемое представление неосведомленным, используя "android: focusable". Вы также должны избегать игры с фокусируемостью и интерактивностью (только что составленными словами) строки списка, просто оставьте их со значением по умолчанию.
Конечно, теперь, когда ваши фокусируемые представления в строке списка не поддаются фокусировке, пользователи, использующие клавиатуру, могут иметь проблемы, а также фокусировать их. Это вряд ли будет проблемой, но на всякий случай, если вы хотите написать 100% безупречные приложения, вы можете использовать событие onItemSelected, чтобы сделать элементы выбранной строки ориентируемыми, а элементы ранее выбранной строки неактивны.
Ответ 7
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();
}
});
Ответ 8
Я использовал getListAdapter(). getItem (position), создающий экземпляр объекта, который содержит мои значения внутри элемента
MyPojo myPojo = getListAdapter().getItem(position);
затем использовал метод getter из myPojo, он будет вызывать его правильные значения внутри элемента.