Intereting Posts
Android-соединение с локальным хостом Bluetooth 4.0 / Smart / Низкая энергия на Samsung Galaxy S3 Android не может использовать hdmi во вкладке объявления и должен быть уведомлен во всех (максимальных) устройствах, как только hdmi будет подключен Программирование с помощью SurfaceView и стратегии потоков для разработки игр В чем разница между потоком и обработчиком Окно Android не изменяет размер / панорамирование при открытии softinput из WebView InitializationError для AndroidJunit4 Конвертировать контент: // URI в фактический путь в Android 4.4 Фотосъемка с камеры в фрагменте Android: доступ к файлу базы данных sqlite для файлов с расширением .sqlite Как очистить кэш проекта в идее Intellij, например, Eclipse? Конец анимации Невозможно создать многопользовательский чат (MUC) с библиотекой aSmack для Android: «package.DefaultPacketExtension нельзя отнести к пакету. MUCUser» Вызывается callback afterTextChanged () без фактического изменения текста Нет ответа от удаленного клиента: ошибка при передаче файла с использованием asmack

ExpandableListView расширяется только на определенной кнопке?

Хорошо, я пытаюсь создать ExpandableListView, например Spotify, но это не так. Но я не знаю, как отключить LinearLayout, чтобы действовать как кнопка (Развернуть список). Я создал изображение, которое должно описывать, что мне нравится , Мне нравится иметь возможность обрабатывать щелчок по тексту / изображению (родительский) как нормальное взаимодействие. Щелчок правой кнопкой мыши должен расширить список, как в Spotify …

Первая фотография показывает действие расширения (сейчас), второе показывает действие расширения, как оно должно быть ...

Solutions Collecting From Web of "ExpandableListView расширяется только на определенной кнопке?"

Это немного старый вопрос, но этот ответ может кому-то помочь.

Если вы хотите развернуть / свернуть группу, нажав на определенную Button или какой-либо другой View , вы должны получить эту кнопку в методе getGroupView в своем классе адаптера. Затем в методе onClick вашей Button вы должны либо перевести parent в ExpandableListView , либо передать ссылку в конструкторе при создании адаптера.

Я предпочитаю первый подход. Вот код, предполагая, что у вас есть один TextView и ImageView который является стрелкой. Я добавил изменение состояния стрелки тоже.

 @Override public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, final ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.left_drawer_list_group, parent, false); } TextView listHeaderText = (TextView) convertView .findViewById(R.id.left_menu_list_header_text); ImageView listHeaderArrow = (ImageView) convertView.findViewById(R.id.left_menu_list_header_arrow); listHeaderText.setText(headerTitle); //Set the arrow programatically, so we can control it int imageResourceId = isExpanded ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float; listHeaderArrow.setImageResource(imageResourceId); listHeaderArrow.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(isExpanded) ((ExpandableListView) parent).collapseGroup(groupPosition); else ((ExpandableListView) parent).expandGroup(groupPosition, true); } }); return convertView; } 

Кроме того, вы хотите отключить расширение / свертывание в прослушивателе onGroupClick .

 @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { //Do some other stuff, but you shall not expand or collapse return true; } 

Существует еще один метод, но довольно плохой, и вы копируете весь класс Adapter внутри класса, где вы создаете ExpandableListView и устанавливаете Adapter . Но не делайте этого. Шутки в сторону! 😉

Это onCreate из ChannelList, который расширяет ListFragment. Он сохраняет данные и генерирует новый адаптер, если вызывается фрагмент.

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { m_ListView = new ExpandableListView(getActivity()); m_ListView.setId(android.R.id.list); m_ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); m_ListView.setMultiChoiceModeListener(m_MultiChoiceModeListener); m_ChannelListAdapter = new ChannelListAdapter(getActivity(), this); m_ListView.setAdapter(m_ChannelListAdapter); m_ListView.setGroupIndicator(null); m_ListView.setOnGroupClickListener(this); return m_ListView; } 

На адаптере у меня есть метод getGroupView, который выглядит так:

 public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { if (view == null) { view = inflater.inflate(R.layout.layout_channelwithimage, viewGroup, false); } TextView textView = (TextView) view.findViewById(R.id.labelwithimage); textView.setText(getGroup(i).toString()); ImageButton imbu = (ImageButton) view.findViewById(R.id.imageButton); //imbu.setOnClickListener(this); imbu.setFocusable(false); return view; } 

Поэтому, если я зарегистрирую ImageButton в адаптере, он вызовет onClick из адаптера. Но в onClick я не знаю, какая группа была нажата … Если я не зарегистрирую кнопку на любом слушателе, она не будет вызывать onGroupClick из ChannelList …

Не слишком элегантное решение, но оно помогло мне:

Я сохранил оригинальный идентификатор группы. Мне нравилось поведение.

На макете groupItem я просто заблокировал пространство с пустым представлением, чтобы исходный идентификатор groupIndicator по-прежнему был доступен для кликов:

 <LinearLayout> .... <!--just dummy space underneath the default expand_collapse group icon - this way original expand collapse behavior is preserved on the icon--> <View android:layout_width="25dp" android:layout_height="match_parent"> </View> <!-- text view will have actionListener --> <TextView android:id="@+id/category_name" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" .... /> .... </LinearLayout> 

Затем прокрался в объект callBack при создании ExpandableListAdapter и подключил его onClick к «category_name» (как для дочерних, так и для групповых элементов)

 public class ExpandableListAdapter extends BaseExpandableListAdapter { public interface OnCategoryActionListener { boolean onCategorySelected(long categoryId); } .... public ExpandableListAdapter(Activity context, Category rootCategory, OnCategoryActionListener callBack) { this.context = context; this.rootCategory = rootCategory; this.callBack = callBack; } .... @Override public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String categoryName = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.category, null); } TextView item = (TextView) convertView.findViewById(R.id.category_name); item.setTypeface(null, Typeface.BOLD); item.setText(categoryName); item.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { callBack.onCategorySelected(getGroupId(groupPosition)); } }); ..... 

Все, что вам нужно сделать, это правильно инициализировать ExpandableListAdapter в классе основных фрагментов

 expListAdapter = new ExpandableListAdapter(getActivity(), this.rootCategory, new OnCategoryActionListener()); expListView = (ExpandableListView) getActivity().findViewById(R.id.categories_list); expListView.setAdapter(expListAdapter);