ListView mit OnItemClickListener

75

Ich benutze einen Brauch ListViewmit RatingBarund ImageButton. Hier ist mein Problem: Wenn ich auf meine ListViewklicke OnItemClickListener, funktioniert meine nicht. Bitte kann mir jemand helfen. Code:

ListView lv = getListView();
setContentView(lv);
lv.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
        Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show();
    }
});
NikhilReddy
quelle
Bitte fügen Sie einen Code hinzu. Und warum funktioniert das nicht? Ein Fehler?
Ivan
Ich erhalte keine Fehler, auch wenn ich debugge, es geht auch nicht hinein. Ich werde einen Code posten.
NikhilReddy
1
@gujjula nikhilreddy Poste einen Code.
Venky
3
Ich habe dieses Problem bereits zuvor überprüft. <br/> Überprüfen Sie meinen Artikel, um Ursachen und Lösungen zu finden: xjaphx.wordpress.com/2011/07/14/… <br/> Ich denke, Sie treffen Szenario 3.
Pete Houston
1
Ich fand die Antwort in diesem Beitrag, dem ersten Kommentar: stackoverflow.com/questions/5551042/…
Carlos Espinoza

Antworten:

122

Obwohl eine sehr alte Frage, aber ich poste immer noch eine Antwort darauf, damit es jemandem helfen kann. Wenn Sie ein Layout in der Listenansicht verwenden, verwenden Sie ...

android:descendantFocusability="blocksDescendants"    

... im ersten übergeordneten Layout innerhalb der Liste. Dies funktioniert wie von Zauberhand. Der Klick wird von keinem Element in der Liste verbraucht, sondern geht direkt zum Listenelement.

Shaista Naaz
quelle
2
Genial. Es hat sehr geholfen
Gokhan Arik
1
Es hat bei mir funktioniert. Wenn ich die obige Eigenschaft hinzugefügt habe, funktionieren sowohl der Listenklick als auch der Knopfklick. Beide funktionieren. Vielen Dank.
Raghuveer
1
Toll!! Antwort .. Prost :)
SwiftBoy
Vielen Dank. Ich habe Android Apps seit 3 ​​Jahren entwickelt. Ich hätte nie gedacht, dass dieser einfache Trick funktioniert.
Venkat Vinay
Wurde für einen ganzen Tag mit dem gleichen Problem stecken .. Vielen Dank ... Nie hätte es erraten
Jitendra Sawant
18

Ich habe eine Aktivität, die ListActivity erweitert.

Ich habe versucht, so etwas in onCreate zu tun:

ListView listView = getListView();
listView.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {

        Log.i("Hello!", "Y u no see me?");

    }

});

Aber das hat nicht funktioniert.

Stattdessen musste ich einfach onListItemClick überschreiben:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {

    Log.i("Hello!", "Clicked! YAY!");

}
vornehm
quelle
17

Hey, überprüfe das, funktioniert für mich ... hoffe, es funktioniert auch für dich

Wenn Listenelement enthält ImageButton

Problem: OnItemClickListenerantwortet einfach überhaupt nicht!

Grund: Keine Ahnung

Lösung: Setzen Sie im Code den ImageButtonFokus auf“false”

1: ImageButton button = (ImageButton) convertView.findViewById(R.id.imageButton);

2: button.setFocusable(false);

Grv9098
quelle
1
Hat mein Leben gerettet. Vielen Dank
Darko Petkovski
11

Wenn Sie das Element aktivieren möchten, klicken Sie in der Listenansicht auf

listitem.setClickable(false);

Das mag auf den ersten Blick falsch erscheinen, aber es funktioniert!

Rahul Tiwari
quelle
10

Wenn die Listenelementansicht eine Schaltfläche, ein Kontrollkästchen oder eine Bildschaltfläche enthält, funktionieren der onitemclicklistener und der onitemlongclicklistener nicht, da sie über einen eigenen onclick-Listener verfügen.

setze fokussierbar als falsch

holder.button.setFocusable(false);
RVG
quelle
9

1) Überprüfen Sie, ob Sie OnItemClickListener oder OnClickListener (für ListView nicht unterstützt) verwenden.
Dokumentation Android Developers ListView

2) Überprüfen Sie, ob Sie Listener ordnungsgemäß zu Ihrer ListView hinzugefügt haben. Es ist an ListView gebunden, nicht an ListAdapter!

ListView.setOnItemClickListener(listener);

3) Wenn Sie OnClickListener verwenden müssen, überprüfen Sie, ob Sie DialogInterface.OnClickListeneroder verwenden View.OnClickListener(sie können einfach ausgetauscht werden, wenn sie nicht validiert sind oder beide verwenden).

Marek Sebera
quelle
Der Code, den ich benutze, hat eine Listaktivität erweitert. hier ist mein codeListView lv = getListView (); setContentView (lv); lv.setOnItemClickListener (neuer OnItemClickListener () {@Override public void onItemClick (AdapterView <?> arg0, View arg1, int position, long arg3) {Toast.makeText (SuggestionActivity.this, "" + position, Toast.LENGTH_HORT) ();}}); }
NikhilReddy
5

Sie können auch verwenden lambda. Die Lambda-Syntax wird unter Java 1.7 oder früheren JVMs nicht unterstützt.

listView.setOnItemClickListener((parent, view, position, id) -> {
    ...
});
bheatcoker
quelle
4

setClickable als false für ImageButton wie folgt

imagebutton.setClickable(false);

und dann OnItemClickListenerzur Listenansicht ausführen .

Ramakrishna
quelle
4

Wenn Sie Ihre ListView programmgesteuert definieren:

mListView.setDescendantFocusability(ListView.FOCUS_BLOCK_DESCENDANTS);
jmaculate
quelle
4
listPaired = (ListView) findViewById( R.id.listView1 );
listPairedData = new ArrayList < String >();
araPaired = new ArrayAdapter( this, android.R.layout.simple_list_item_1, listPairedData );
listPaired.setAdapter( araPaired );
listPaired.setOnItemClickListener( listPairedClickItem );

private OnItemClickListener listPairedClickItem = new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView < ? > arg0, View arg1, int arg2, long arg3) {

        String info = ( (TextView) arg1 ).getText().toString();
        Toast.makeText( getBaseContext(), "Item " + info, Toast.LENGTH_LONG ).show();
    }
};
Tsiftis
quelle
2

In Java wie andere vorschlagen

listitem.setClickable(false);

Oder in XML:

android:clickable="false"

Es funktioniert sehr gut

Vlad
quelle
1

Fügen Sie einfach die Zeile in die Bewertungsleiste ein:

android:isIndicator="true"

In XML sieht die Bewertungsleiste so aus.

<RatingBar
    android:id="@+id/ratingBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="6dp"
    android:isIndicator="true"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />
Abhishek Majumdar
quelle
1

Android OnItemClickLIstener steht in Konflikt mit dem OnClickListener von Elementen der Zeile der Listenansicht im Adapter. Sie müssen nur sicherstellen, dass Ihr Code gut verwaltet und ordnungsgemäß mit Standards geschrieben ist.

Überprüfen Sie die Antwort unter dem unten angegebenen Link:

Liste anklickbar machen

Zohaib Hassan
quelle
1
lv.setOnItemClickListener( new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView < ? > parent, View view,
                            int position, long id) {
        // TODO Auto-generated method stub

    }
} );
Morteza Jalambadani
quelle
0

Die einfachste und einfachste Lösung, die ich anbieten kann, ist diese. Sie müssen nur diese beiden Schritte ausführen.

1. Fügen Sie dies in Ihre XML-Datei ein.

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:id="@+id/list_view"
        android:layout_below="@+id/info_text"
        />

  1. Fügen Sie dies in Ihre MainActivity-Datei ein.

        ListView listView;
        listView = findViewById(R.id.list_view);

        String[] fruits = new String[5];
        fruits[0]="hello";
        fruits[1]="hello";
        fruits[2]="hello";
        fruits[3]="hello";
        fruits[4]="hello";

        List newList = new ArrayList(Arrays.asList(fruits));
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, newList);
        listView.setAdapter(arrayAdapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) {
                String selectedItem = (String) parent.getItemAtPosition(position);
                Toast.makeText(DisplayPannel.this, selectedItem, Toast.LENGTH_SHORT).show();            }
        });

Zia
quelle
0

Von vielen gefragt, dürfen die Kinder in der Liste nicht die Breite "match_parent" haben, wenn Sie nur nach Listenansicht suchen.

Selbst wenn Sie "Focusable" auf "false" setzen, funktioniert dies nicht. Setzen Sie die Breite des Kindes auf wrap_content

<TextView
    android:id="@+id/itemchild"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    ...
Hassi
quelle