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
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();
}
});
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.
Il suffit de mettre
Android:focusable="false"
Android:clickable="false"
dans la mise en page. Pour toutes les vues de texte, boutons, etc.
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"
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);
}
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();
}
});
}}
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