Activity
code de classe:
conversationList = (ListView)findViewById(Android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
La fonction getView
dans la classe Adapter
:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
Y at-il un problème avec l'utilisation de deux XML en gonflant?
Je viens de trouver une solution d'ici .. mais en cliquant profondément ...
Si un élément de ligne de la liste contient une vue activable ou cliquable, OnItemClickListener
ne fonctionnera pas.
L'élément de ligne doit avoir un paramètre comme Android:descendantFocusability="blocksDescendants"
.
ici, vous pouvez voir un exemple de la manière dont votre élément de liste devrait ressembler à . Votre élément de liste xml devrait être ...
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:baselineAligned="false"
Android:descendantFocusability="blocksDescendants"
Android:gravity="center_vertical" >
// your other widgets here
</LinearLayout>
Le problème est que vos mises en page contiennent des éléments pouvant être mis au point ou pouvant être cliqués . Si une vue contient des éléments pouvant être mis au point ou pouvant être cliqués, OnItemCLickListener ne sera pas appelé.
Cliquez ici pour plus d'informations.
S'il vous plaît postez un de vos XML XML de mise en page si ce n'est pas le cas.
Pour mes listes, mes lignes comportent d'autres éléments sur lesquels il est possible de cliquer, tels que des boutons, de sorte que la création d'un bloc blocksDescendants ne fonctionne pas. Au lieu de cela, j'ajoute une ligne dans le fichier XML du bouton:
Android:focusable="false"
Cela empêche les boutons de bloquer les clics sur les lignes, mais permet également aux boutons de prendre les clics également.
vous devez effectuer 2 étapes dans votre listview_item.xml
Android:descendantFocusability="blocksDescendants"
Android:clickable="false"
Android:focusable="false"
Android:focusableInTouchMode="false"
Voici un exemple: listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_marginTop="10dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:gravity="center_vertical"
Android:orientation="vertical"
Android:descendantFocusability="blocksDescendants">
<RadioButton
Android:id="@+id/script_name_radio_btn"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:textColor="#000"
Android:padding="5dp"
Android:clickable="false"
Android:focusable="false"
Android:focusableInTouchMode="false"
/>
</LinearLayout>
utiliser le code ci-dessous à l'intérieur de la balise button dans la disposition de ligne personnalisée de listview
Android:focusable="false"
Android:clickable="false"
Utilisez Android: descendantFocusability
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="80dip"
Android:background="@color/light_green"
Android:descendantFocusability="blocksDescendants" >
Ajouter ci-dessus dans la disposition racine
J'ai eu le même problème et je viens de voir que j'avais accidentellement réglé:
@Override
public boolean isEnabled(int position)
{
return false;
}
sur ma classe CustomListViewAdapter.
En remplaçant ceci par:
return true;
J'ai réussi à résoudre le problème ... juste au cas où quelqu'un aurait fait la même erreur ...
Je l'ai résolu avec l'aide de cette réponse
1.Ajouter les éléments suivants dans la disposition linéaire de list_items.xml Android:descendantFocusability="blocksDescendants"
2. Vues d'enfants de LinearLayout dans list_items.xml
Android:focusable="false"
Même si j’avais le même problème, j’ai une case à cocher, a fait ce qui suit pour masquer le travail d’articleClickListener,
Ajout des propriétés suivantes à la case à cocher,
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
et ItemClickListner a commencé à fonctionner.
Pour un exemple détaillé, vous pouvez passer par le lien,
http://knowledge-cess.com/Android-itemclicklistner-with-checkbox-or-radiobutton/
J'espère que ça aide Cheers !!
si vous avez des vues de texte, des boutons ou des informations cliquables ou sélectionnables dans votre affichage de lignes uniquement
Android:descendantFocusability="blocksDescendants"
n'est pas assez. Vous devez définir
Android:textIsSelectable="false"
à vos textviews et
Android:focusable="false"
à vos boutons et autres éléments de mise au point.
J'ai eu le même problème et j'ai essayé toutes les solutions mentionnées en vain. après des tests, j’ai trouvé que rendre le texte sélectionnable empêchait l’auditeur d’être appelé. Donc, en le commutant sur false ou en le supprimant, mon auditeur a été appelé à nouveau.
Android:textIsSelectable="false"
espérons que cela aide quelqu'un qui a été coincé comme moi.
Cela présentait deux solutions géniales: si votre extension ListFragment à partir d'un fragment, sachez que mListView.setOnItemClickListener
ne sera pas appelée avant la création de votre activité, cela est garanti lorsque cette activité est définie
@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 à remplacer 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);
}
dans mon cas, aucune des propriétés de mise en page XML n'était utile.
Je viens d'ajouter une seule ligne de code comme ceci: convertView.setClickable (false);
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null || convertView.getTag() == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
...
convertView.setClickable(false);
return convertView;
}
donc, fondamentalement, il fait la même chose que la configuration des propriétés dans la mise en page XML, mais c'est seulement la chose qui fonctionne dans mon cas.
Ce n'est pas un timing parfait, mais peut-être que cela aidera quelqu'un Bon codage
Ajouter ceci dans la disposition principale
Android:descendantFocusability="blocksDescendants"
Écrivez ce code dans chaque bouton, Textview, ImageView, etc. qui ont OnClick
Android:focusable="false"
Android:clickable="false"
J'espère que ça va marcher.
J'ai eu le même problème, j'utilisais un style pour mes textes dans la disposition des lignes qui avait l'attribut "focusable". Cela a fonctionné après que je l'ai enlevé.
J'ai essayé tout ce qui précède et RIEN n'a fonctionné.
J'ai résolu le problème comme suit:
Tout d'abord, je définis un bouton personnalisé appelé ListButton
public class ListButton extends Android.widget.Button
{
private ButtonClickedListener clickListener;
public ListButton(Context context)
{
this(context, null);
}
public ListButton(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public ListButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setClickListener(ButtonClickedListener listener) {
this.clickListener = listener;
}
@Override
public boolean isInTouchMode() {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
eventClicked();
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_MOVE:
break;
default :
}
return true;
}
private void eventClicked() {
if (this.clickListener!=null) {
this.clickListener.ButtonClicked();
}
}
}
Le XML ressemble à:
<dk.example.views.ListButton
Android:id="@+id/cancel_button"
Android:layout_width="125dp"
Android:layout_height="80dp"
Android:text="Cancel"
Android:textSize="20sp"
Android:layout_margin="10dp"
Android:padding="2dp"
Android:background="#000000"
Android:textColor="#ffffff"
Android:textStyle="bold"
/>
Ensuite, je définis ma propre interface ButtonClicked
Listener:
public interface ButtonClickedListener {
public void ButtonClicked();
}
Ensuite, j'utilise mon propre auditeur comme s'il s'agissait de la variable normale OnClickListener
:
final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);
cancelButton.setClickListener(new ButtonClickedListener() {
@Override
public void ButtonClicked() {
//Do your own stuff here...
}
});
Android: l'attribut autoText rend également TextView autofocus.
Face au même problème, essayé pendant des heures. Si vous avez essayé toutes les solutions ci-dessus, essayez de modifier layout_width de Listview et l'élément de liste en match_parent à partir de wrap_content.
private AdapterView.OnItemClickListener onItemClickListener;
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
.......
final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(null, view, position, -1);
}
}
});
return convertView;
}
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
Ensuite, dans votre activité, utilisez adapter.setOnItemClickListener () avant de l'attacher à la vue liste.
Ce qui a fonctionné pour moi a été d'ajouter le code ci-dessous à chaque sous-vue de la présentation de mon fichier row.xml
Android:focusable="false"
Android:focusableInTouchMode="false"
Donc dans mon cas:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/testingId"
Android:text="Name"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/dummyId"
Android:text="icon"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/assignmentColor"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/testID"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:text="TextView"
//other stuff
/>
</Android.support.constraint.ConstraintLayout>
Et voici mon appel setOnItemClickListener dans ma sous-classe Fragment:
CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
CustomListView.setAdapter(customAdapter);
CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Testing", "onitem click working");
// other code
}
});
J'ai eu la réponse de ici !
Si vous souhaitez utiliser à la fois le clic simple et le clic long sur les éléments de la liste, le meilleur moyen de le mettre en œuvre serait d'utiliser le menu contextuel pour un clic long. Évitez d’utiliser setItemLongClickListener, en particulier si vous avez plusieurs dispositions de lignes pour votre vue de liste.
Tout ce qui précède a échoué pour moi. Cependant, j'ai pu résoudre le problème (après plusieurs heures passées à me cogner la tête - Google, si vous écoutez, essayez de réparer ce que j'ai rencontré ci-dessous sous la forme d'erreurs de compilation, si possible).
Vous devez vraiment faire attention aux attributs Android que vous ajoutez à votre présentation xml ici (dans cette question originale, cela s'appelle list_items.xml). Pour moi, ce qui posait problème, c’est que j’étais passé d’une vue EditText à une vue TextView et que j’avais perdu les attributs dus au changement (dans mon cas, inputType). Le compilateur ne l'a pas compris et la cliquabilité a tout simplement échoué lorsque je suis allé exécuter l'application. Vérifiez tous les attributs que vous avez dans vos nœuds XML de mise en page.