Подтвердить что ты не робот

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

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

Большое спасибо!

4b9b3361

Ответ 1

Если вы используете 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);
    }

Ответ 2

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

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

Ответ 3

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

Ответ 4

Если вы хотите создать или повторно использовать или существующий обработчик, который реализует 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, a ListActivity или ListFragment, например

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