web-dev-qa-db-fra.com

OnItemClickListener sur un ListView à l'intérieur d'un fragment ne fonctionne pas

EDIT: RESOLU. S'il y a quelque chose de focalisable dans le XML des éléments, cela cassera le contact de la liste, en d'autres termes, Android: focusable = false pour toutes les cases à cocher, les commutateurs ou tout ce qui ressemble à celui de ur list. Et fait =)

Ok, voici mon problème.

J'ai écrit une application qui utilise des onglets et des fragments , et tout se passe comme je veux, sauf que lorsque je tente de capturer un onItemClick sur un listView il ne marque même pas la ligne comme touchée/enfoncée /choisi.

J'ai lu un peu sur le sujet et beaucoup de gens ont le même problème, mais je n'ai trouvé aucune réponse qui puisse m'aider du tout.

Je ne veux pas implémenter un ListFragment, en fait, je ne sais même pas comment/pourquoi je devrais le faire, et comme tout mon code fonctionne déjà, je ne sais pas si l'implémentation de l'un d'eux me donnera beaucoup plus de travail, alors, le voici:

Est-il possible d'implémenter un auditeur pour un clic sur un listView, à l'intérieur d'un fragment? et si c'est le cas, comment?

PD: minSDK = 14, tatgetSDK = 15

13
Dunnow

Voici un extrait de code qui fera ce que vous voulez.

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

Les gens trébuchent d'habitude là-dessus, voyez si vous avez ceci couvert:

Tous les clics et rappels (par exemple, les rappels de menu/barre d’action) sont envoyés à l’activité à laquelle le fragment est lié. Ils doivent donc être dans la classe d’activité et non dans la classe de fragment.

4
Dheeraj Bhaskar

Il suffit de mettre 

Android:focusable="false"
Android:clickable="false"

dans la mise en page. Pour toutes les vues de texte, boutons, etc.

8
Ashwin S Ashok

Cela peut être utile Réponse de raghunanadan dans le lien ci-dessous a résolu mon problème

listview OnItemClick listner ne fonctionne pas dans le fragment

Ajouter ceci à la mise en page 

Android:descendantFocusability="blocksDescendants"

5
Vinay

Cela était deux solutions géniales: si votre extension ListFragment étendue à partir d'un fragment, sachez que mListView.setOnItemClickListener ne sera pas appelé avant la création de votre activité, comme l'a implicitement @ dheeraj-bhaskar. Cette solution a assuré qu'elle est définie lorsque l'activité a été créée.

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

En regardant le code source de ListFragment, je suis tombé sur cette

    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) 
{
        }
}

Un objet onItemClickListener est attaché et appelle onListItemClick() En tant que telle, l'autre solution similaire, qui fonctionne exactement de la même manière, consiste à ignorer 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);
        } 
2
Rowland Mtetezi

Si vous voulez transmettre des données d'un fragment à une activité sur un clic sur Listview, vous pouvez modifier votre code comme ...

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();
        }
    });
}}
1
Javed

Voici un aperçu du flux de travail, créez votre ListView et son Adapter correspondant (utilisé pour mapper vos données sous-jacentes aux éléments de ListView), définissez l'adaptateur sur ListView, puis ajoutez-y une OnItemClickListener.

Vous trouverez plus de détails et un exemple de code sur: http://developer.Android.com/guide/topics/ui/declaring-layout.html#AdapterViews

0
Brent Hronik