Intereting Posts
Установить значение по умолчанию для целочисленного столбца SQLite WebView на Android ICS, проблемы iframe с android_assets Ограничение на создание проекта консоли разработчика Google Android Support Library: getDrawable независимо, если вектор или нет Может ли VideoView отсоединяться и повторно подключаться без остановки потока? Как вызвать событие, когда scrollView достигает нижней части Android? Как просмотреть подробные данные определенного элемента списка Предотвратить выделение невидимого div в Android WebView Как управлять страницами ViewPages с другой страницы Android: документация для контента: // sms / "type" значения? Объект POST для отдыха с использованием Spring для android Создать случайный цвет Java Java.lang.SecurityException:! @Too много сигналов тревоги (500), зарегистрированных с pid 10790 uid 10206 Белый фон во время запуска приложения Нарисуйте анимацию высокого разрешения с высокой частотой кадров на Android

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);