OnItemClickListener в ListView внутри фрагмента не работает

РЕДАКТИРОВАНИЕ: РЕШЕНО. Если в XML элементов есть что-то, что можно сфокусировать, это нарушит прикосновение к списку, другими словами, android: focusable = false для всех флажков, переключателей или чего-то подобного в вашем списке. Готово =)

Итак, вот моя проблема.

Я написал приложение, которое использует вкладки и фрагменты, и все идет так, как я хочу, за исключением того, что когда я пытаюсь захватить onItemClick в listView , оно даже не помечает строку как коснулись/нажали/выбрали.

Я немного читал о том, что у многих людей такая же проблема, но я не нашел ответов, которые мне вообще помогли.

Я не хочу реализовывать ListFragment, на самом деле я даже не знаю, как/почему я должен, и поскольку весь мой код уже работает, я не знаю, даст ли мне его реализация гораздо больше работы, Итак, вот оно:

Можно ли реализовать прослушиватель щелчка по listView внутри фрагмента? и если да, то КАК?

PD: minSDK=14, tatgetSDK=15


person Dunnow    schedule 15.02.2013    source источник
comment
Обычно вы используете OnItemClickListener, а не OnClickListener, с ListView, независимо от того, находится ли он во фрагменте или нет.   -  person CommonsWare    schedule 15.02.2013
comment
... я знаю, что... я, очевидно, имел в виду метод onItemClickListener, и он не работает внутри фрагмента.   -  person Dunnow    schedule 16.02.2013
comment
@Dunnow У меня похожая проблема. Можете ли вы помочь мне решить это? Его разместили здесь. stackoverflow.com/ вопросы/42542056/   -  person Sulav Timsina    schedule 02.03.2017


Ответы (7)


Просто поставь

android:focusable="false"
android:clickable="false"

в макете. Для всех текстовых представлений, кнопок и т. д.

person Ashwin S Ashok    schedule 09.12.2013

Это может быть полезно. Ответ от raghunanadan по ссылке ниже решил мою проблему.

список списка OnItemClick не работает во фрагменте

Добавьте это в макет

android:descendantFocusability="blocksDescendants"

person Vinay    schedule 09.10.2015
comment
Ваш ответ попал в Low quality review queue как link-only answer. На данный момент вы не можете видеть очередь из-за низкой репутации в SO, но другие, с более высокой репутацией, могут. Когда такие ответы просматриваются другими, кто-то может оставить комментарий, сообщающий вам, что вопрос может нуждаться в улучшении (как я в этом случае) или голосовать против (например, парень, который проголосовал против). Поэтому, пожалуйста, попытайтесь избежать ответа только по ссылке. - person Onik; 09.10.2015

Вот два замечательных решения: если вы расширяете ListFragment из фрагмента, знайте, что mListView.setOnItemClickListener не будет вызываться до создания вашей активности, как подразумевал @dheeraj-bhaskar. Это решение обеспечило его установку при создании активности.

@Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
                // Do the onItemClick action

                Log.d("ROWSELECT", "" + rowId);
            }
        });
    }

Просматривая исходный код ListFragment, я наткнулся на это

    public class ListFragment extends Fragment {
        ...........................................
     ................................................

        final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() 
{
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
{
                onListItemClick((ListView)parent, v, position, id);
            }
        };
       .................................................................
    ........................................................................

    public void onListItemClick(ListView l, View v, int position, long id) 
{
        }
}

Объект onItemClickListener прикреплен и вызывает onListItemClick() Таким образом, другое подобное решение, которое работает точно так же, заключается в переопределении onListItemClick()

 @Override
        public void onListItemClick(ListView l, View v, int position, long rowId) {
            super.onListItemClick(l, v, position, id);
           // Do the onItemClick action

                    Log.d("ROWSELECT", "" + rowId);
        } 
person Otieno Rowland    schedule 10.06.2015

Вот обзор рабочего процесса: создайте свой ListView и соответствующий ему Adapter (используемый для сопоставления ваших базовых данных с элементами в ListView), установите адаптер для ListView, а затем добавьте к нему OnItemClickListener.

Дополнительные сведения и пример кода можно найти по адресу: http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

person Brent Hronik    schedule 15.02.2013
comment
Единственное, что отличалось бы от фрагмента, так это вызов getActivity() везде, где требуется контекст. - person Brent Hronik; 16.02.2013
comment
конечная активность Activity = getActivity(); Toast.makeText(деятельность, выбор Faena: + + fullObject.getTitle(), Toast.LENGTH_LONG).show(); - person Dunnow; 16.02.2013
comment
элементы в списке даже не помечаются синим цветом, когда я их касаюсь, поэтому НИЧЕГО из списка не работает, я заполнил его, я установил свой адаптер, я могу даже снять флажки, которые я добавил к ним, но я могу не делать onItemClick - person Dunnow; 16.02.2013
comment
Не могли бы вы опубликовать весь свой список, адаптер и инициализацию itemClickListener, а также свой xml для вашего фрагмента? - person Brent Hronik; 16.02.2013
comment
ideone.com/P715aq ‹-- фрагмент ideone.com/xFMj39 ‹-- пользовательский адаптер ideone.com/we97d1 ‹-- результаты адаптера (жестко запрограммированные, как только я заработаю, я очистю код и прочее дерьмо), я думаю, что все это связано со списком/фрагментом (фрагмент является частью интерфейса с вкладками) - person Dunnow; 16.02.2013
comment
Хм, у меня действительно нет слов, все вроде бы правильно :/ - person Brent Hronik; 17.02.2013
comment
Ааа, надо было попросить посмотреть на макет элемента списка. Хороший улов однако! - person Brent Hronik; 19.02.2013
comment
На самом деле вы это сделали, дело в том, что я даже не опубликовал это, так как думал, что это даже не имеет значения (раньше у меня никогда не было фокусируемого элемента в списке, поэтому ... я просто предположил, что это тоже правильно) - person Dunnow; 19.02.2013

Если вы хотите передать данные из фрагмента в любое действие при нажатии Listview, вы можете изменить свой код, например...

class HistoryFragment extends Fragment {  ListView historyListView;
public HistoryFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v= inflater.inflate(R.layout.fragment_history, container, false);
    historyListView= (ListView) v.findViewById(R.id.historyDataListView);

    sendRequest();  //it is my meathod to load the listview and set the adapter
    return  v;
}

public void onStart() {
    super.onStart();
    historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Intent intent=new Intent(getActivity(), DisplayDetails.class);

            intent.putExtra("text", historyListView.getItemAtPosition((int) l).toString());
            startActivity(intent);
          //  Toast.makeText(getActivity(),"Hello.. "+historyListView.getItemAtPosition((int) l).toString(),Toast.LENGTH_LONG).show();
        }
    });
}}
person Javed    schedule 08.02.2017
comment
если вы поместите это в onStart(), оно будет вызываться каждый раз, когда вызывается onStart - person Mohit Rajput; 14.09.2020

кнопка повлияет на слушателя, попробуйте не использовать кнопку и перекомпилировать, она должна работать

person user9402274    schedule 06.01.2019

person    schedule
comment
пробовал... не работает внутри фрагмента, как я уже говорил - person Dunnow; 16.02.2013
comment
это дает мне ошибку, если я выполняю этот код внутри метода onCreate, запускает отладку еще до того, как моя активность начинается: S. И если я устанавливаю этот фрагмент на самом основном, он помечает объявление и получает lv=(ListView) .. , как неправильная строка. - person Dunnow; 19.02.2013
comment
@Dunnow, можете ли вы добавить это как ответ или принять один из ответов здесь - person Dheeraj Bhaskar; 21.02.2013
comment
я отредактировал первый пост, чтобы отразить, как я его решил, но я отмечу ваш ответ, я думаю, так как это все еще правильно сделать с этим кодом, проблема была не там, а в XML u_u - person Dunnow; 22.02.2013
comment
@Dunnow, если вы поместите этот код в свой код onViewCreated внутри вашего класса фрагмента (класс, который расширяет Fragment), он будет работать нормально, пока вы инициализируете свой ListView (lv = (ListView)view.findViewById(R.id. ВАШ lv ;) - person whyoz; 14.05.2013
comment
@DheerajBhaskar У меня похожая проблема. Можете ли вы помочь мне решить это? Его разместили здесь. stackoverflow.com/ вопросы/42542056/ - person Sulav Timsina; 02.03.2017
comment
@SulavTimsina позвольте мне взглянуть - person Dheeraj Bhaskar; 03.03.2017