ListFragment onItemClickListener не работает

Я использую макет с вкладками (со свайпом). Здесь у меня есть 3 вкладки, контролируемые SectionsPagerAdapter. Каждая вкладка представляет собой ListFragment.

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

Вот код сейчас (который не работает, событие не запускается).

public class NyhederFragment extends ListFragment {
     public static final String ARG_SECTION_NUMBER = "section_number";
     private static final String TAG="NyhederFragment";
     private List<Item> newsItems;
     private ArrayList newsHeadlines;
     private ArrayAdapter adapter;
     private BroadcastReceiver updateReciever;

public NyhederFragment() {
}

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

    ListView newsList = new ListView(getActivity());
    newsList.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
    newsList.setId(R.id.list);
    DatabaseHelper dbConn = new DatabaseHelper(getActivity());

    newsItems = dbConn.getAllItemsFromNews();
    newsHeadlines = new ArrayList();
    for(Item i : newsItems){
        newsHeadlines.add(i.getTitle());
    }

    adapter = new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, newsHeadlines);

    setListAdapter(adapter);

    newsList.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                  int position, long id) {
            Log.i("debug", "single click");
        }
    });

    dbConn.close();

    getActivity().registerReceiver(updateReciever, new IntentFilter("ArticlesUpdated"));
    return newsList;
}
}

Что это, я делаю неправильно?

Заранее большое спасибо!


person dthomasen    schedule 29.12.2012    source источник


Ответы (4)


Если вы используете ListFragment, вы можете просто использовать его метод переопределения onListItemClick()

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
    }
person Lalit Poptani    schedule 29.12.2012
comment
да. Разобрался, но не смог ответить на свой вопрос. (см комментарий к посту ниже). Но все равно большое спасибо! :) - person dthomasen; 29.12.2012
comment
Ура! Наконец-то что-то сработало! Я потратил последние полчаса на поиск решения, и это было оно! Спасибо! - person cnfw; 03.03.2014
comment
спас меня! в моем случае - person kuldeep; 20.05.2015

Это связано с пользовательским элементом списка. Фокус по умолчанию находится на пользовательском элементе списка (кнопка/текстовое представление). Это вызывает эту проблему.

Пожалуйста, добавьте android:descendantFocusability="blocksDescendants" в корневой макет элемента списка. Надеюсь, это поможет кому-то.

person Nandha    schedule 27.03.2013

изменить setListAdapter(adapter); на newsList.setAdapter(adapter);

person confucius    schedule 29.12.2012
comment
Хм.. Все еще не работает. Но держу пари, что это тоже была ошибка. Спасибо! - person dthomasen; 29.12.2012
comment
Сам разобрался :) Решение состояло в том, чтобы переопределить onListItemClick из ListFragment :) Однако не могу ответить из-за низкой репутации. - person dthomasen; 29.12.2012

Если вы хотите создать или повторно использовать или уже существующий обработчик, который реализует AdapterView.OnItemClickListener, а не реализует onListItemClick() в ListFragment, вы можете сделать это, получив ссылку на ListView из ListFragment и установив его прослушиватель. В вашем ListFragment.onResume() вы можете сделать:

@Override
public void onResume() {
    super.onResume();
    ListView listView = getListView();
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("TAG", "Stop touching me");
        }
    });
}

В моем случае я могу использовать один и тот же слушатель из Activity с ListView, ListActivity или ListFragment, например.

listView.setOnItemClickListener(new MyListViewOnClickListener(getActivity()));

person Rich    schedule 24.01.2015