OnItemClickListener im adapter wird nicht aufgerufen

  • Antworten:12
Robbiani Renato
  • Forum-Beiträge: 609

06.11.2019, 18:13:30 via Website

Hallo zusammen

Ich komme in einem Problem nicht mehr weiter. In meiner Activity habe ich eine ListView mit einem Adapter verknüpft. Wenn ich auf eine Zeile klicke soll eine weitere Activity geöffnet werden. Aber die Methode vom OnItemClickListener wird nie aufgerufen.

Meine Activity:

package ch.robbisoft.sakristanhilfe;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Set;

public class eingabe extends Activity {

public static final String APPNAME = "SAKRISTAN";
public static final String FELDNAME = "TEXT";
public static final String DATNAME = "STRDAT";
private Context ctx;
private Button btn_speichern;
private TextView edt_datum;
private ListView liste;
private listAdapter adapter;
private List<Eintrag> EintragListe;
private Button btn_suche;
private Button btn_minus;
private Button btn_plus;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_eingabe);
    ctx = getApplication();

    //macht das die Tastatur nicht gliech angezeigt wird
    getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

    EintragListe = new ArrayList<Eintrag>();
    inital();

    edt_datum = (TextView) findViewById(R.id.edt_datum);
    edt_datum.setText(get_datum());

    liste = (ListView) findViewById(R.id.livi_text);
    adapter = new listAdapter(ctx, 0);
    liste.setAdapter(adapter);
    //Liste aufbauen
    adapter.notifyDataSetInvalidated();
    //Klick Ereignisse
    liste.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
            Log.d("sakristanhilfe", "LongClickEreignis");
            //Langes Klicken auf ein Feld in der ListView
            return true;
        }
    });
    liste.setOnItemClickListener(new ListView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Log.d("sakristanhilfe", "ClickEreignis");
            startActivity(new Intent(ctx, work.class));
        }
    });

    btn_speichern = (Button) findViewById(R.id.btn_speichern);
    btn_speichern.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    btn_suche = (Button) findViewById(R.id.btn_suchen);
    btn_suche.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

    btn_plus = (Button) findViewById(R.id.btn_minus);
    btn_plus.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clickMinus();
        }
    });
}

/**********************************************************************************************
 * Löscht einen Eintrag aus der Stringliste
 *
 * @autor robbisoft @version 19. Februar 2019
 * @param
 * @return
 **********************************************************************************************/
private void clickMinus() {
    try {
        int n_pos = 1;
        String str_text;

// str_text = stringListe.get(n_pos);
// n_pos = stringListe.indexOf((String) str_text);
// str_text = adapter.getItem(n_pos);
// Log.d((String) str_text);
// n_pos = adapter.getPosition("Eintrag 2");

    }catch (Exception  e){

// e.getMessage();
}
}

/**********************************************************************************************
 * Nimt die initialisierung des Fensters vor
 *
 * @autor robbisoft @version 9. Februar 2019
 * @param
 * @return
 **********************************************************************************************/
private void inital(){
    Date jetzt;
    String str_jetzt;
    Calendar zeitstempel = Calendar.getInstance();
    SimpleDateFormat datumsformat = new SimpleDateFormat("d. MMMM yyyy");
    jetzt = zeitstempel.getTime();
    str_jetzt = datumsformat.format(jetzt);
    Eintrag eingabe = new Eintrag();
    eingabe.dat_datum = jetzt;
    eingabe.str_text = "Eintrag Nummer 1";
    EintragListe.add(eingabe);
}

/**********************************************************************************************
 * Ermittelt das aktuelle Datum und gibt es als String zurück
 *
 * @autor robbisoft @version 2.02.2019
 * @param
 * @return aktuelles Datum als String
 **********************************************************************************************/
private String get_datum(){
    String d_jetzt;

    //Zeitermitteln und ausgeben
    Calendar zeitstempel = Calendar.getInstance();
    SimpleDateFormat datumsformat = new SimpleDateFormat("d. MMMM yyyy");
    d_jetzt = datumsformat.format(zeitstempel.getTime());

    return d_jetzt;
}

/**********************************************************************************************
 * Legt einen Eintrag in den Speicher
 *
 * @autor robbisoft @version 13.02.2019
 * @param "String zum Speichern"
 * @return
 **********************************************************************************************/
private void speichern(List<String> d_datum, List<String> str_text){
    SharedPreferences pref = getSharedPreferences(APPNAME, 0);
    SharedPreferences.Editor edit = pref.edit();
    edit.putStringSet(DATNAME, (Set<String>;) d_datum);
    edit.putStringSet(FELDNAME, (Set<String>;) str_text);
    edit.commit();
}

/**********************************************************************************************
 * Liest einen Eintrag aus dem Speicher
 *
 * @autor robbisoft @version 10.02.2019
 * @param "String zum Speichern"
 * @return
 **********************************************************************************************/
private List<String> lesen(){
    List<String> str_text;
    SharedPreferences pref = getSharedPreferences(APPNAME, 0);

// str_text = pref.getString(FELDNAME, "Fehler");
str_text = (List) pref.getStringSet(FELDNAME, null);
return str_text;
}

/**********************************************************************************************
 * Adapter um die Besonderheiten einzugeben
 *
 * @autor robbisoft @version 6. November 2019
 * @param "Liste der Besonderheitn"
 * @return
 **********************************************************************************************/
class listAdapter extends  ArrayAdapter<Eintrag>{

    public listAdapter( Context context, int resource) {
        super(context, resource);
    }

    @Override
    public int getCount(){
        int n_anzahl = EintragListe.size();
        return n_anzahl;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            convertView = getLayoutInflater().inflate(R.layout.list_element, null);
        }
        Eintrag eintrag;
        eintrag = EintragListe.get(position);

        TextView datum = (TextView) convertView.findViewById(R.id.edt_datum);
        datum.setText(eintrag.dat_datum.toString());

        TextView text = (TextView) convertView.findViewById(R.id.edt_text);
        text.setText(eintrag.str_text);

        return convertView;
    }
}

}

Das Layout dazu:

<?xml version="1.0" encoding="utf-8"?>

xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/lay_eingabeElemente"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".eingabe">

<LinearLayout
    android:id="@+id/lay_oben"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <EditText
        android:id="@+id/edt_datum"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:ems="10"
        android:inputType="date" />

    <Button
        android:id="@+id/btn_suchen"
        style="@style/Widget.AppCompat.Button"
        android:layout_width="50dp"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_weight="1"
        android:background="@android:drawable/ic_search_category_default" />
</LinearLayout>

<ListView
    android:id="@+id/livi_text"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:cacheColorHint="@color/colorTransparent" />

<LinearLayout
    android:id="@+id/lay_buttons"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btn_minus"
        style="@style/Widget.AppCompat.Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="start"
        android:layout_weight="1"
        android:background="@android:drawable/ic_delete" />

    <Button
        android:id="@+id/btn_speichern"
        style="@style/Widget.AppCompat.Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:background="@android:drawable/ic_menu_save" />

    <Button
        android:id="@+id/btn_plus"
        style="@style/Widget.AppCompat.Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end"
        android:layout_weight="1"
        android:background="@android:drawable/ic_input_add" />
</LinearLayout>

Das Layout vom Adapter

<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/lay_eingabe"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:id="@+id/edt_datum"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:ems="10"
    android:inputType="date"
    android:longClickable="false" />

<TextView
    android:id="@+id/edt_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end" />

Warum wird die Methode nie aufgerufen? Was mache ich falsch?

Gruss Renato

Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

06.11.2019, 18:57:52 via Website

Ich vermute du musst der ListView sagen, dass sie "longClickable" ist und im ParentLayout das blockDescendants setzen:
https://stackoverflow.com/a/41633859

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

06.11.2019, 20:39:47 via Website

Hallo eigentlich solte das so richtig sein mit dem listner. Versuche mal von ListActivity zu erben oder besser von
AppCompatActivity. Nur von Activity macht nicht mehr viel Sinn. Ist zwar in vielen Beispiele im Netz noch zufinden
aber nicht mehr zeitgemäß.

Wenn du deine neue activity per intent aufrufst soltest du ihr auch mitteilen auf weches Icon geklickt wurde.
Ich denke das hattest du noch vor. ;)
Macht ja nicht viel Sinn wenn die gar nicht weiß welcher Listen Eintrag geklickt wurde.

— geändert am 07.11.2019, 08:02:18

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

09.11.2019, 21:53:57 via Website

Hallo zusammen

Leider haben eure Tipps nichts gebracht.
Könnte es daran liegen, dass ich oben ein EditText Feld habe, welches den Fokus hat?

Gruss Renato

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

09.11.2019, 22:20:37 via App

Dann doch lieber ne eigene RecyclerView nehmen

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

10.11.2019, 10:07:01 via Website

Könnte es daran liegen, dass ich oben ein EditText Feld habe, welches den Fokus hat?

Nein das wird es nicht sein.

Habe mir nochmal dein Layout angesehen und es auch mal in den Editor geladen.

Da Sollest du eigentlich gleich sehen das da was nicht stimmt.
Deine Listview ist außerhalb vom Layout.
Schon dein Eltern Layout ist falsch. Es müsste eigentlich am Ende zweimal LinearLayout stehen.
denn alle deine Views gehören da rein.
Du hast ein Eltern LinearLayout, in dem ist das erste Linearlayout, dann das Listview, und ein weiteres Linearlayout. Am Ende sollte das Eltern Layout geschlossen werden.

Auch gibt es bei LinearLayout kein "0dp" benutze match_parent dafür. Das 0dp ist für CostrainLayout.
das wird wohl der Hauptfehler sein.

RecyclerView ja ist sinnvoll aber wenn du das Layout schon falsch aufbaust wird dir das auch nicht viel bringen.
Gewöhne dir an das Layout auch in der Editor Ansicht also den XML Code anzusehen. Und dort zu schauen ob da was Rot unterstrichen ist.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/lay_eingabeElemente"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".eingabe">

    <LinearLayout
        android:id="@+id/lay_oben"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/edt_datum"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:ems="10"
            android:inputType="date" />

        <Button
            android:id="@+id/btn_suchen"
            style="@style/Widget.AppCompat.Button"
            android:layout_width="50dp"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_weight="1"
            android:background="@android:drawable/ic_search_category_default" />
    </LinearLayout>

    <ListView
        android:id="@+id/livi_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:cacheColorHint="@color/colorTransparent" />

    <LinearLayout
        android:id="@+id/lay_buttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_minus"
            style="@style/Widget.AppCompat.Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:layout_weight="1"
            android:background="@android:drawable/ic_delete" />

        <Button
            android:id="@+id/btn_speichern"
            style="@style/Widget.AppCompat.Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:background="@android:drawable/ic_menu_save" />

        <Button
            android:id="@+id/btn_plus"
            style="@style/Widget.AppCompat.Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_weight="1"
            android:background="@android:drawable/ic_input_add" />
    </LinearLayout>
</LinearLayou>

— geändert am 10.11.2019, 10:30:52

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

11.11.2019, 22:07:02 via Website

Ciao Jokel

Mit der xml-Datei magst du recht haben. Aber bei mir ist nichts rot unterlegt. Wenn es rot gewesen wäre dann hätte ich mein Programm nicht ausführen können. Zumal bin ich der Meinung.

Also wenn ich dich richtig verstehe, dann muss ich in meine Activity ein drittes Layout hinen. Denn ich möchte oben die Suche haben in der Mitte die Daten und unten am Rand die Steuerbuttons.

Oder verstehe ich dich falsch?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

12.11.2019, 05:29:40 via Website

Ja du verstehst mich falsch. Das Layout was ich gepostet habe sollte gehen.

Bei deinem Code hat wohl wider das Forum einiges an Programm Code verschluckt. Ich füge, bei Code, immer einen Tapstop in jeder Zeile am Anfang ein dann werden die spitzen Klammern nicht verschluckt. Kannst ja den ganzen Text im Editor markieren und einmal Tap drücken. Dann wieder markieren und nun hier einfügen. Dann versteht es das das Forums auch.
Dann wird es hoffentlich nicht wieder so ein Missverständnis geben.

— geändert am 12.11.2019, 22:24:23

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

12.11.2019, 22:05:56 via Website

Hallo das Layout für List Item solt so ausehen .
mit sicherheit war die Anzeige die Listen nicht so wie gewünscht.
angaben von Datentypen haben hier nichts zu suchen.
android:ems="10"
android:inputType="date"
Löschen

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lay_eingabe"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/edt_datum"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:layout_gravity="start" />

    <TextView
        android:id="@+id/edt_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end" />

</LinearLayout>
Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

14.11.2019, 10:25:48 via Website

Hallo zusammen

Ich habe eine neue Activity erstellt mit dem Adapter darin.
Nun geht der "setOnItemLongClickListener". Aber der "setOnItemClickListener" will einfach nicht funktionieren.

package ch.robbisoft.sakristanhilfe;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Besonderes extends AppCompatActivity {

private Context ctx;
private ListView liste;
private List<Eintrag> EintragListe;
private ListeAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_besonderes);
    ctx = getApplication();

    EintragListe = new ArrayList<Eintrag>();
    inital();
    liste = (ListView) findViewById(R.id.livi_besonderes);
    adapter = new ListeAdapter(ctx, 0);
    liste.setAdapter(adapter);
    liste.setOnItemClickListener(new ListView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Log.d("sakristanhilfe", "ClickEreignis");
            startActivity(new Intent(ctx, work.class));
        }
    });
    liste.setOnItemLongClickListener(new ListView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
            Log.d("sakristanhilfe", "LongClickEreignis");
            return true;
        }
    });
    adapter.notifyDataSetInvalidated();
}

private void inital(){
    Date jetzt;
    String str_jetzt;
    Calendar zeitstempel = Calendar.getInstance();
    SimpleDateFormat datumsformat = new SimpleDateFormat("d. MMMM yyyy");
    jetzt = zeitstempel.getTime();
    str_jetzt = datumsformat.format(jetzt);
    Eintrag eingabe = new Eintrag();
    eingabe.dat_datum = jetzt;
    eingabe.str_text = "Eintrag Nummer 1";
    EintragListe.add(eingabe);
    eingabe = new Eintrag();
    eingabe.dat_datum = jetzt;
    eingabe.str_text = "Eintrag Nummer 2";
    EintragListe.add(eingabe);
}

class ListeAdapter extends ArrayAdapter<Eintrag> {

    public ListeAdapter(Context context, int resource) {
        super(context, resource);
    }

    @Override
    public int getCount(){
        int n_anzahl = EintragListe.size();
        return n_anzahl;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView==null){
            convertView = getLayoutInflater().inflate(R.layout.list_element, null);
        }
        Eintrag eintrag;
        eintrag = EintragListe.get(position);

        TextView datum = (TextView) convertView.findViewById(R.id.edt_datum);
        datum.setText(eintrag.dat_datum.toString());

        TextView text = (TextView) convertView.findViewById(R.id.edt_text);
        text.setText(eintrag.str_text);

        return convertView;
    }
}

}

Das Layout

<?xml version="1.0" encoding="utf-8"?>

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Besonderes">

<ListView
    android:id="@+id/livi_besonderes"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cacheColorHint="@color/colorTransparent"
    android:clickable="true"
    android:focusable="true"
    android:longClickable="true" />

Und das Layout vom Adapter

<?xml version="1.0" encoding="utf-8"?>

android:id="@+id/lay_eingabe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
android:longClickable="true">

<TextView
    android:id="@+id/edt_datum"
    android:layout_width="150dp"
    android:layout_height="wrap_content"
    android:layout_gravity="start"
    android:clickable="true"
    android:focusable="true"
    android:inputType="none"
    android:longClickable="true" />

<TextView
    android:id="@+id/edt_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="end"
    android:clickable="true"
    android:longClickable="true"
    android:focusable="true" />

Was kann ich noch tun?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

14.11.2019, 11:28:36 via Website

Hallo habe doch schon gesagt das du keinen Eingabe typ angeben darfst.
Schaue dir doch mal richtig das Layout in meinem post an.
Da bringt dir das none auch nichts.
Weg mit dem Mist.
Und auch clickable, longClickabl ist default also ohne Angabe auf true. Brauchst du auch nicht. Fokus ist hier auch default. Das ist ja nur ein Text. TextView und kein EditText.

Das Layout von mir geht und reicht auch.

Also Kommplet weg mit den Parametern. Dann geht es auch.

Nochmal sage ich es nicht.

— geändert am 14.11.2019, 15:04:04

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.530

14.11.2019, 20:45:55 via Website

Ps. dein inputType="none" kannst du angeben ist aber sinnlos.

Die anderen Parameter nicht.
Gibt es nur bei EditText nicht bei TextView.

Ein Blick in die Doku hilft.
https://developer.android.com/reference/android/widget/TextView
Da wirst du die Parameter nicht finden.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 609

15.11.2019, 09:48:54 via Website

Ciao Jokel

Danke für deine Geduld. Jetzt funktioniert es auch.

Gruss Renato

Hilfreich?
Kommentieren