Элемент списка без кнопки

У меня есть элемент списка с кнопкой внутри.

Когда кнопка отображается, элемент списка больше не доступен для просмотра. Чтобы сделать его кликабельным снова, я заменил кнопку с видом. Проблема в том, что при щелчке элемента списка кнопка меняет фоновое изображение (например, если оно нажато). Как избежать этого плохого поведения?

благодаря

Solutions Collecting From Web of "Элемент списка без кнопки"

На самом деле я только что нашел замечательное объяснение: http://android.cyrilmottier.com/?p=525

Проблема и решение очень хорошо объяснены там.

Установите для вас следующие свойства:

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

Для ImageButton также добавьте следующее в родительское представление

  android:descendantFocusability="blocksDescendants" 

Часть ссылки, предоставленной @Matroska, которая отвечает на вопрос:
Вы должны добавить

 android:descendantFocusability="blocksDescendants" 

К родительской ViewGroup, которая определяет макет элемента вашего ListView.

Примечание: это больше не позволит вам сфокусироваться на внутренней кнопке с помощью аппаратных кнопок. (Извините, я еще не могу прокомментировать)

Вы можете попробовать следующее:

  yourButton.setFocusable(false); yourButton.setFocusableInTouchMode(false); 

Ниже приведен пример кнопки clickable внутри ListView. Если вы хотите загрузить проект, вы можете загрузить проект IntelliJ Gradle с моего веб-сайта: http://developersfound.com/ListButtonClickExample.zip

Пользовательский адаптер в этом примере имеет прослушиватель кликов вместо прослушивателя внутри фрагмента или действия. Это делается так, что существует только объект-слушатель, и все кнопки привязаны к ним для повышения эффективности.

Вот макет ListItem:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.jc_systems.listbuttonclickexample.app.ItemFragment"> <LinearLayout android:id="@+id/test_container" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/image_list_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/exaple_icon" android:layout_weight=".1" android:layout_gravity="left|top"/> <TextView android:id="@+id/lbl_list_item" android:layout_width="168dp" android:layout_height="wrap_content" android:text="I think this should take up two lines..." android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:gravity="center_vertical|center_horizontal" android:layout_gravity="center_vertical"/> <Button android:id="@+id/cmd_list_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello" android:layout_weight="0.2" android:paddingLeft="0dp" android:paddingRight="0dp" android:paddingTop="0dp" android:paddingBottom="0dp" android:layout_gravity="right|top"/> </LinearLayout> </FrameLayout> 

И вот CustomAdapter:

 import android.app.Activity; import android.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; public class MyCustomAdapter extends ArrayAdapter { private final ArrayList<FragmentItems> list; private static Activity context; private View.OnClickListener adaptrDynaListener = null; public MyCustomAdapter(Activity context, ArrayList<FragmentItems> list) { super(context, R.layout.fragment_items, list); this.context = context; this.list = list; adaptrDynaListener = new View.OnClickListener() { @Override public void onClick(View v) { String buttonText = ((Button) v).getText().toString(); new AlertDialog.Builder(MyCustomAdapter.context).setTitle("Alert").setMessage(buttonText).setNeutralButton("OK", null).show(); } }; } static class ViewHolder { protected ImageView image_list_image; protected TextView lbl_list_item; protected Button cmd_list_button; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; ViewHolder viewHolder = new ViewHolder(); if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.fragment_items, null); viewHolder.image_list_image = (ImageView) view.findViewById(R.id.image_list_image); viewHolder.lbl_list_item = (TextView) view.findViewById(R.id.lbl_list_item); viewHolder.cmd_list_button = (Button) view.findViewById(R.id.cmd_list_button); viewHolder.cmd_list_button.setTag(viewHolder); view.setTag(viewHolder); } else { view = convertView; viewHolder = (ViewHolder) view.getTag(); } ViewHolder holder = (ViewHolder) view.getTag(); holder.lbl_list_item.setText(list.get(position).getMessage()); holder.cmd_list_button.setText(list.get(position).getButtonText()); holder.cmd_list_button.setOnClickListener(adaptrDynaListener); return view; }//public View getView(int position, View convertView, ViewGroup parent) public int getCount() { if(list.size() <= 0) { return 1; } return list.size(); } public Object getItem(int position) { return position; } public long getItemId(int position) { return position; } } 

Я протестировал этот шаблон адаптера довольно широко, и он кажется очень стабильным в ListView, ListActivities и ListFragments.

Вы можете создать xml-файл, содержащий кликированное поведение представления. Создайте xml-файл, custom_button.xml (или все, что вы хотите назвать) и заполните его этим кодом:

 <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Focused --> <item android:state_focused="true" android:state_pressed="false" android:color="@color/black"/> <!-- Pressed --> <item android:state_focused="false" android:state_pressed="true" android:color="@color/black"/> <!-- Focused+Pressed --> <item android:state_focused="true" android:state_pressed="true" android:color="@color/black"/> <!-- Disabled --> <item android:state_enabled="false" android:color="@color/dark_grey_text"/> <!-- Default --> <item android:color="@color/white"/> </selector> 

Затем вы можете изменить

 android:color="" 

к

 android:drawable="" 

И назначьте их любым доступным ресурсам, которые у вас есть в вашей папке с возможностью выбора. Затем в файле xml для вашего макета, содержащего представление, добавьте:

 android:background="custom_button"