it-swarm.com.de

OnItemCLickListener funktioniert nicht in der Listenansicht

Activity Klassencode:

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

Die getView-Funktion in der Adapter-Klasse:

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

Gibt es ein Problem bei der Verwendung von zwei xmls während des Aufblasens?

225
hiei

Ich habe gerade eine Lösung von hier gefunden.

Wenn ein Zeilenelement der Liste eine fokussierbare oder anklickbare Ansicht enthält, funktioniert OnItemClickListener nicht.

Das Zeilenelement muss einen Parameter wie Android:descendantFocusability="blocksDescendants" haben.

hier sehen Sie ein Beispiel, wie Ihr Listenelement aussehen sollte . Ihr Listenelement xml sollte ....__ sein.

<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>
702
Bhavesh Hirpara

Das Problem ist, dass Ihre Layouts fokussierbare oder anklickbare Elemente enthalten. Wenn eine Ansicht fokussierbare oder anklickbare Elemente enthält, wird der OnItemCLickListener nicht aufgerufen.

Klicken Sie auf hier für weitere Informationen.

Bitte senden Sie eine Ihrer Layout-XMLs, falls dies nicht der Fall ist.

87
balazsbalazs

Für meine Listen haben meine Zeilen andere Elemente, die angeklickt werden können, wie z. B. Schaltflächen. Daher funktioniert das Blockieren von BlocksDescendants nicht. Stattdessen füge ich eine Zeile in der xml der Schaltfläche hinzu:

    Android:focusable="false"

Dadurch wird verhindert, dass die Schaltflächen die Klicks in den Zeilen blockieren, die Schaltflächen können jedoch auch die Klicks übernehmen.

56
Janene Pappas

du musst 2 Schritte in deiner listview_item.xml machen

  1. setze das Grundlayout mit: Android:descendantFocusability="blocksDescendants"
  2. legen Sie eine fokussierbare oder anklickbare Ansicht in diesem Element fest mit:
    Android:clickable="false" 
    Android:focusable="false"
    Android:focusableInTouchMode="false"

Hier ist ein Beispiel: 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>
29
Eddy

verwenden Sie den folgenden Code im Schaltflächen-Tag im benutzerdefinierten Zeilenlayout der Listenansicht

 Android:focusable="false"
 Android:clickable="false"
18
Milan Shukla

Verwenden Sie 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" >

Fügen Sie oben im Root-Layout hinzu

17
Amar Gore

Ich hatte das gleiche Problem und sah gerade, dass ich aus Versehen eingestellt hatte:

@Override
public boolean isEnabled(int position)
{
    return false;
}

in meiner CustomListViewAdapter-Klasse.

Ändern Sie dies in:

return true;

Ich habe es geschafft, das Problem zu beheben ... Falls jemand den gleichen Fehler gemacht hat ...

16
Woody

Ich habe es mit Hilfe von dieser Antwort gelöst

1.Fügen Sie Folgendes im linearen Layout von list_items.xml .__ hinzu. Android:descendantFocusability="blocksDescendants" 

2.Erstellen Sie Ansichten von LinearLayout in list_items.xml

 Android:focusable="false" 
11

Sogar ich hatte das gleiche Problem, ich habe ein Ankreuzfeld, das folgende, um masker itemClickListener zu arbeiten,

Folgende Eigenschaften wurden dem Kontrollkästchen hinzugefügt:

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

und ItemClickListner begann zu arbeiten.

Für ein detailliertes Beispiel können Sie den Link aufrufen,

http://knowledge-cess.com/Android-itemclicklistner-mit-checkbox-or-radiobutton/

Hoffe es hilft Prost !!

10
Gokul Kulkarni

wenn Sie über Textansichten, Schaltflächen oder Zeichen verfügen, die nur in Ihrer Zeilenansicht anklickbar oder auswählbar sind

Android:descendantFocusability="blocksDescendants"

ist nicht genug. Sie müssen einstellen 

Android:textIsSelectable="false"

zu Ihren Textansichten und 

Android:focusable="false"

zu Ihren Knöpfen und anderen fokussierbaren Elementen.

10
savepopulation

Ich hatte das gleiche Problem und versuchte alle genannten Lösungen ohne Erfolg. Durch Tests habe ich festgestellt, dass die Auswahl des Textes den Aufruf des Listeners verhindert. Durch Umschalten auf "false" oder "Entfernen" wurde mein Listener erneut aufgerufen. 

Android:textIsSelectable="false"

ich hoffe, das hilft jemandem, der wie ich festgefahren ist.

5
u2tall

Zwei großartige Lösungen waren dies: Wenn Ihr erweiterendes ListFragment aus einem Fragment besteht, sollten Sie wissen, dass mListView.setOnItemClickListener nicht aufgerufen wird, bevor Ihre Aktivität erstellt wird. Dies stellt sicher, dass es festgelegt ist, wenn die Aktivität erstellt wurde

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

Als ich den Quellcode für ListFragment sah, stieß ich darauf

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

Ein onItemClickListener-Objekt ist angehängt und ruft onListItemClick() auf. Daher ist die andere ähnliche Lösung, die auf die gleiche Art und Weise funktioniert, das Überschreiben von 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);
} 
3
Rowland Mtetezi

in meinem Fall war keine der XML-Layout-Eigenschaften nicht hilfreich.

Ich füge einfach eine einzelne Codezeile wie folgt hinzu: 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;
}

im Grunde ist es das Gleiche wie das Einrichten von Eigenschaften in XML-Layout, aber in meinem Fall funktionierte nur das.

Es ist kein perfektes Timing, aber vielleicht hilft es jemandem

2
Marek Skóra
  1. Fügen Sie dies im Hauptlayout hinzu 

    Android:descendantFocusability="blocksDescendants"
    
  2. Schreiben Sie diesen Code in jede Schaltfläche, Textview, ImageView usw., die OnClick haben 

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

Ich hoffe es wird klappen.

2
Wajid khan

Ich hatte das gleiche Problem, ich verwendete einen Stil für meine Texte im Zeilenlayout, der das Attribut "fokussierbar" hatte. Es hat funktioniert, nachdem ich es entfernt habe.

1
Miguel Rdz

Ich habe alles oben ausprobiert und NICHTS hat funktioniert.

Ich habe das Problem wie folgt gelöst:

Zuerst definiere ich einen benutzerdefinierten Button namens 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();
    }
}

}

Das XML sieht folgendermaßen aus:

<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"  
/>

Dann definiere ich meine eigene ButtonClicked Listener-Schnittstelle:

public interface ButtonClickedListener {
    public void ButtonClicked();
}

Dann benutze ich meinen eigenen Listener, als wäre es die 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...
        }

    });
1
AndreasReiff

Android: Das autoText-Attribut macht TextView automatisch fokussierbar.

Konfrontiert mit demselben Problem, stundenlang versucht. Wenn Sie alle oben genannten Schritte ausgeführt haben, ändern Sie layout_width von Listview und Listenelement in match_parent von wrap_content.

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

Verwenden Sie dann in Ihrer Aktivität adapter.setOnItemClickListener (), bevor Sie es an die Listenansicht anhängen.

Kopiert von github es hat für mich funktioniert

0
Java coder

Die Sache, die für mich funktioniert hat, war, den folgenden Code zu jeder Unteransicht im Layout meiner Datei row.xml hinzuzufügen:

Android:focusable="false"
Android:focusableInTouchMode="false"

Also in meinem Fall:

<?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>

Und dies ist mein setOnItemClickListener-Aufruf in meiner Fragment-Unterklasse:

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
            }

        });

Ich habe die Antwort von hier !

0
spcarlin

Wenn Sie sowohl den einfachen Klick als auch den langen Klick auf Listenansichtselemente verwenden möchten, können Sie dies besser implementieren, wenn Sie das Kontextmenü für einen langen Klick verwenden. Vermeiden Sie die Verwendung von setItemLongClickListener, insbesondere wenn Sie für Ihre Listenansicht mehrere Zeilenlayouts verwenden. 

0
Samuel Robert

All das ist für mich gescheitert. Ich konnte das Problem jedoch beheben (nachdem ich den Kopf viele Stunden geknallt hatte - Google, wenn Sie zuhören, prüfen Sie bitte, was ich unten gefunden habe, wenn möglich in Form von Compiler-Fehlern)

Sie müssen wirklich darauf achten, welche Android-Attribute Sie Ihrem XML-Layout hier hinzufügen (in dieser ursprünglichen Frage heißt sie list_items.xml). Für mich war das Problem das Problem, dass ich von einer EditText-Ansicht zu einer TextView gewechselt war und das übrig gebliebene Attribut cruft (in meinem Fall inputType). Der Compiler hat es nicht verstanden und die Klickbarkeit schlug fehl, als ich die App ausführte. Überprüfen Sie alle Attribute, die Sie in Ihren Layout-XML-Knoten haben.

0
Ted_Zactly