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

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

Хорошо, вот моя проблема.

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

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

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

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

PD: minSDK = 14, tatgetSDK = 15

Ответ 1

Вот фрагмент кода, который сделает то, что вы хотите.

ListView lv;

//code to get the listView instance using findViewByID etc

lv.setOnItemClickListener(new OnItemClickListener()
{
    @Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
    { 
        Toast.makeText(EnclosingActivity.this, "Stop Clicking me", Toast.LENGTH_SHORT).show();
    }
});

Люди обычно путешествуют по этому вопросу, посмотрите, есть ли у вас это:

Все клики и обратные вызовы (например: обратные вызовы меню/действия) отправляются в действие, к которому привязан фрагмент, поэтому они должны быть в классе активности, а не в классе фрагментов.

Ответ 2

Просто поместите

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

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

Ответ 4

Два удивительных решения заключались в том, что если расширенный 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);
        } 

Ответ 5

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

Более подробную информацию и пример кода можно найти по адресу: http://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews

Ответ 6

Если вы хотите передать данные из фрагмента в любое действие в списке 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();
        }
    });
}}