OnItemclickListerner wird nicht durchlaufen

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

11.12.2021, 22:40:31 via Website

Hallo zusammen

Ich habe ein Adapter mit Checkboxen.

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

android:id="@+id/lay_vor"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<CheckBox
    android:id="@+id/chkb_vor"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

und in der MainActivity

private ListView list_vor;

private VorAdapter adapter_vor;

list_vor = (ListView) findViewById(R.id.lisv_vor);
adapter_vor = new VorAdapter(ctx, 0);
list_vor.setAdapter(adapter_vor);
adapter_vor.notifyDataSetInvalidated();

Ich möchte dass sich die Checkbox ändert wenn ich sie Anklicke. Aus mir unerfindlichen Grund wird die OnItemclickListener nicht durchlaufen.

       list_vor.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckBox objekt = (CheckBox) view;
            objekt.setChecked(!objekt.isChecked());
        }
    });

Sieht jemand was ich falsch mache?

Der Vollständigkeitshalber stelle ich noch den Code von meiner MainActivity hin.

package ch.robbisoft.sakristanhilfe;

import android.Manifest;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;

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

public class MainActivity extends AppCompatActivity {

String[] rechte = new String[]{
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_EXTERNAL_STORAGE
};
public static final int MULTIPLE_PERMISSIONS = 99;
private String str_text;
private Context ctx;
private Context ac_ctx;
private Toolbar tbar;

private MenuInflater inflater;
private TextView obj_besonders;
private List<Eintrag> besonderes;
private Memory speicher;
private DatePickerDialog dat_dialog;
private Calendar kalender;
private Intent param;
private int n_position;
private SimpleDateFormat alt_dat, neu_dat;

private TerminDaten optionen;

private String str_vor = "";
private String str_nach = "";
private ListView list_vor;
private ListView list_nach;

private VorAdapter adapter_vor;
private NachAdapter adapter_nach;
private List<String> str_list_vor;
private List<String> str_list_nach;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ctx = getApplicationContext();
    ac_ctx = this;
    alt_dat = new SimpleDateFormat(getString(R.string.datum_kurz));
    neu_dat = new SimpleDateFormat(getString(R.string.datum_lang));

    tbar = (Toolbar) findViewById(R.id.tob_main);
    tbar.setTitle(getResources().getString(R.string.lbl_sakristan));
    tbar.inflateMenu(R.menu.main_menu);
    setSupportActionBar(tbar);
    optionen = laden();

    FestTage festtage;
    festtage = new FestTage();

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

    speicher = new Memory(ctx);
    list_vor = (ListView) findViewById(R.id.lisv_vor);
    obj_besonders = (TextView) findViewById(R.id.txt_besonderes);
    list_nach = (ListView) findViewById(R.id.lisv_nach);

    adapter_vor = new VorAdapter(ctx, 0);
    adapter_nach = new NachAdapter(ctx, 0);

    //prüft ob OS Version > 6 ist, denn vorher kann nicht geprüft werden
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        //prüfen ob Rechte vorhanden sind um auf das Dateisystem zu zugreifen
        if (pruefrechte()) {
            //initialisieren der Oberfläche
            initial();
            listebauen();
        } else {
        }
    }else{
        //initialisieren der Oberfläche
        initial();
        listebauen();
    }
    list_vor.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckBox objekt = (CheckBox) view;
            objekt.setChecked(!objekt.isChecked());
        }
    });
}

/**********************************************************************************************
 * Erstellt die Adapter Listen für die Vor- und Nachbearbeitung
 *
 * @author robbisoft  @since 2. September 2021
 * @param
 * @return
 * @exception
 * @throws
 **********************************************************************************************/
private void listebauen(){
    str_list_vor = teilestr(str_vor);
    str_list_nach = teilestr(str_nach);

    list_vor.setAdapter(adapter_vor);
    adapter_vor.notifyDataSetInvalidated();
    list_nach.setAdapter(adapter_nach);
    adapter_nach.notifyDataSetInvalidated();
}

private List<String> teilestr(String str_liste){
    List<String> liste = new ArrayList<String>();
    if(!str_liste.isEmpty()) {
        int n_pos = 0;
        String str_pool = "";
        do {
            if(str_liste.charAt(n_pos) != '\n') {
                str_pool += str_liste.charAt(n_pos);
                n_pos++;
            }else{
                liste.add(str_pool);
                n_pos++;
                str_pool = "";
            }
        } while (n_pos < str_liste.length());
        liste.add(str_pool);
    }
    return liste;
}

/**********************************************************************************************
 * Initialisiert die App
 * Erweiterung für den Christ Köniz und den Advent
 *
 * @autor robbisoft @version 6.12.2021
 * @param
 * @return
 **********************************************************************************************/
private void initial(){
    //Datumermitteln und ausgeben
    Calendar zeitstempel = Calendar.getInstance();
    String str_text = "";

    //Liturgiefarbe setzen
    Date begin = null, end = null, jetzt = null;
    kalender = Calendar.getInstance();
    int n_tag = kalender.get(Calendar.DAY_OF_MONTH);
    int n_monat = kalender.get(Calendar.MONTH);
    int n_jahr = kalender.get(Calendar.YEAR);
    try {
        jetzt = alt_dat.parse(Integer.toString(n_tag) + "." + Integer.toString(n_monat + 1) + "." + Integer.toString(n_jahr));
        kalender.setTime(jetzt);
    } catch (ParseException e) {
        e.printStackTrace();
    }

    FestTage feste = new FestTage();
    if( feste.isNeujahr(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_neujahr));
    }
    //nach Weihnachten
    begin = feste.getNeujahr();
    end = feste.getDreikonig();
    if((jetzt.compareTo(begin) > 0) && (jetzt.compareTo(end) < 0)){
        tbar.setBackgroundColor(Color.WHITE);
    }
    if( feste.isDreikonig(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_konig));
    }
    if( feste.isAschermittwoch(jetzt) ){
        tbar.setBackgroundColor(Color.MAGENTA);
        tbar.setTitle(getResources().getString(R.string.lbl_asche));
    }
    if( feste.isOstermontag(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_osterm));
    }
    if( feste.isAllerheiligen(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_allerh));
    }
    if( feste.isAllerseelen(jetzt) ){
        tbar.setBackgroundColor(Color.MAGENTA);
        tbar.setTitle(getResources().getString(R.string.lbl_allers));
    }
    //Prüfen auf Fastenzeit
    begin = feste.getAschermittwoch();
    end = feste.getOstermontag();
    if((jetzt.compareTo(begin) >= 0) && (jetzt.compareTo(end) < 0)){
        tbar.setBackgroundColor(Color.MAGENTA);
        tbar.setTitle(getResources().getString(R.string.lbl_fasten));
        if( feste.isPalmsonntag(jetzt) ){
            tbar.setBackgroundColor(Color.RED);
            tbar.setTitle(getResources().getString(R.string.lbl_palm));
        }
        if( feste.isGruendonnerstag(jetzt) ){
            tbar.setBackgroundColor(Color.WHITE);
            tbar.setTitle(getResources().getString(R.string.lbl_gruend));
        }
        if( feste.isKarfreitag(jetzt) ){
            tbar.setBackgroundColor(Color.RED);
            tbar.setTitle(getResources().getString(R.string.lbl_karrfrei));
        }
        if( feste.isOsternacht(jetzt) ){
            tbar.setBackgroundColor(Color.WHITE);
            tbar.setTitle(R.string.lbl_osternacht);
        }
        if( feste.isOstern(jetzt) ){
            tbar.setBackgroundColor(Color.WHITE);
            tbar.setTitle(getResources().getString(R.string.lbl_ostern));
        }
    }
    //Prüfen auf Osterzeit
    begin = feste.getOstermontag();
    end = feste.getPfingstmontag();
    if((jetzt.compareTo(begin) > 0) && (jetzt.compareTo(end) < 0)){
        tbar.setBackgroundColor(Color.WHITE);
        if( feste.isPfingsten(jetzt) ){
            tbar.setBackgroundColor(Color.RED);
            tbar.setTitle(getResources().getString(R.string.lbl_pfingst));
        }
    }
    if( feste.isPfingstmontag(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_pingstm));
    }
    if( feste.isSilvester(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_silber));
    }
    if( feste.isChristkonig(jetzt) ){
        tbar.setBackgroundColor(Color.WHITE);
        tbar.setTitle(getResources().getString(R.string.lbl_christ));
    }
    //Prüfen auf Advent
    begin = feste.getAdventEins();
    end = feste.getHeiligabend();
    if((jetzt.compareTo(begin) >= 0 )&& (jetzt.compareTo(end) < 0)){
        tbar.setBackgroundColor(Color.MAGENTA);
        tbar.setTitle(getResources().getString(R.string.lbl_advent));
        if( feste.isErsterAdvent(jetzt) ){
            tbar.setTitle(getResources().getString(R.string.lbl_advent1));
        }
        if( feste.isZweiterAdvent(jetzt) ){
            tbar.setTitle(getResources().getString(R.string.lbl_advent2));
        }
        if( feste.isDritterAdvent(jetzt) ){
            tbar.setTitle(getResources().getString(R.string.lbl_advent3));
        }
        if( feste.isVirterAdvent(jetzt) ){
            tbar.setTitle(getResources().getString(R.string.lbl_advent4));
        }
    }

    String str_akt_dat = alt_dat.format(zeitstempel.getTime());
    besonderes = speicher.load();
    try {
        Date akt_dat = alt_dat.parse(str_akt_dat);
        for(Eintrag inhalt : besonderes){
            if( (akt_dat.compareTo(inhalt.dat_datum)) == 0 ){
                str_text += inhalt.str_text + "\n";
            }
        }
    } catch (ParseException e) {
        e.printStackTrace();
        Toast.makeText(ac_ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
    }
    obj_besonders.setText( str_text );
}

@Override
protected void onDestroy() {
    super.onDestroy();
    speichern(optionen);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int n_id = item.getItemId();
    switch ( n_id ){
        case R.id.mnu_eintrag : {
            startActivity(new Intent(ctx, eingabe.class));
            return true;
        }
        case R.id.mnu_suchen : {
            besonderes = speicher.load();
            kalender = Calendar.getInstance();
            int n_jahr = kalender.get(Calendar.YEAR);
            int n_monat = kalender.get(Calendar.MONTH);
            int n_tag = kalender.get(Calendar.DAY_OF_MONTH);
            //Starten vom Datumsdialog
            dat_dialog = new DatePickerDialog(this, dat_horcher, n_jahr, n_monat, n_tag);
            dat_dialog.show();
            return true;
        }
        case R.id.mnu_termin : {
            Intent was = new Intent(ctx, Termin.class);
            was.putExtra("tit", optionen.getTitel());
            was.putExtra("bes", optionen.getBeschrieb());
            was.putExtra("ort", optionen.getOrt());
            startActivityForResult(was, 2);
            return true;
        }
        case R.id.mnu_fest : {
            startActivity(new Intent(ctx, FestTagsKalender.class));
            return true;
        }
        case R.id.mnu_optionen : {
            //neue Optionen
            Intent opt = new Intent(ctx,SettingsActivity.class);
            startActivityForResult(opt, 1);
            return true;
        }
        default: return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu, menu);
    return super.onCreateOptionsMenu(menu);
}

private boolean pruefrechte(){
    int result;
    List listPermissionsNeeded = new ArrayList<>();
    for (String p:rechte)
    {
        result = ContextCompat.checkSelfPermission(this,p);
        if (result != PackageManager.PERMISSION_GRANTED)
        {
            listPermissionsNeeded.add(p);
        }
    }
    if (!listPermissionsNeeded.isEmpty())
    {
        ActivityCompat.requestPermissions(this, (String[]) listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),MULTIPLE_PERMISSIONS );
        // keine permissions gesetzt
        return false;
    }
    // alle permissions gesetzt
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode)
    {
        case MULTIPLE_PERMISSIONS:
        {
            if (grantResults.length > 0)
            {
                String permissionsDenied = getResources().getString(R.string.lbl_permission);
                for (String per : permissions)
                {
                    if(grantResults[0] == PackageManager.PERMISSION_DENIED)
                    {
                        permissionsDenied += "\n" + per;
                        Toast.makeText(ac_ctx, permissionsDenied, Toast.LENGTH_LONG).show();
                    }
                }
                // Nach dem ersten Male
            }
            return;
        }
    }
}

private DatePickerDialog.OnDateSetListener dat_horcher = new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker datePicker, int n_jahr, int n_monat, int n_tag) {
        Date datum;
        try {
            datum = alt_dat.parse(Integer.toString(n_tag) + "." + Integer.toString(n_monat + 1) + "." + Integer.toString(n_jahr));
            kalender.setTime(datum);
            //Datensuchen
            n_position = 0;
            int n_menge = besonderes.size();
            Eintrag inhalt = new Eintrag();
            inhalt.str_text = getResources().getString(R.string.lbl_kein);
            do{
                inhalt = besonderes.get(n_position);
                n_position++;
            }while ((datum.compareTo(inhalt.dat_datum) != 0) && (n_position < n_menge) );
            //eine Position zurücknehmen sonst wird beim ergänzen im falschen Eintrag ergänzt
            n_position--;
            param = new Intent(ctx, work.class);
            param.putExtra("datum", neu_dat.format(datum));
            param.putExtra("text", inhalt.str_text);
            //nur Aufrufen wenn auch was gefunden wurde
            if((datum.compareTo(inhalt.dat_datum) == 0)) {
                startActivityForResult(param, 3);
            }else{
                dat_dialog.dismiss();
                String str_error = getResources().getString(R.string.lbl_kein);
                Log.e("SakristanHilfe", "Text : " + str_error);
                Toast.makeText(ac_ctx, str_error, Toast.LENGTH_LONG).show();
            }
        } catch (ParseException e) {
            e.printStackTrace();
            Toast.makeText(ac_ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }
};

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode){
        case 1 : {
            if(resultCode == Activity.RESULT_OK){
                    //Neuer Optionenaufruf
                    optionen = laden();
                    listebauen();
            }
            return;
        }
        case 2 : {
            if (resultCode == Activity.RESULT_OK){
                //Zurück vom Termineintragen
                return;
            }
        }
        case 3 : {
            if(resultCode == Activity.RESULT_OK) {
                try{
                    if(data != null) {
                        String str_datum, str_text;
                        str_datum = data.getStringExtra("datum");
                        str_text = data.getStringExtra("text");
                        besonderes.get(n_position).dat_datum = neu_dat.parse(str_datum);
                        besonderes.get(n_position).str_text = str_text;
                        //Speichern der Daten
                        speicher.save(besonderes);
                    }
                } catch (ParseException e) {
                    e.printStackTrace();
                    Toast.makeText(ac_ctx, ctx.getResources().getString(R.string.lbl_error) + e.getMessage(), Toast.LENGTH_LONG).show();
                }
                besonderes.get(n_position).str_text = str_text;
            }
            return;
        }
    }
}

/**********************************************************************************************
 * Speichert die Optionen mit Manager
 *
 * @author robbisoft  @since 5. Mai 2021
 * @param @Daten der Optionen
 * @return
 * @exception
 * @throws
 **********************************************************************************************/
private void speichern(TerminDaten termindaten){
    //neue Optionen
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx);
    SharedPreferences.Editor editor = pref.edit();
    editor.putString("key_termin_titel", termindaten.getTitel());
    editor.putString("key_terminbeschrieb", termindaten.getBeschrieb());
    editor.putString("key_terminort", termindaten.getOrt());
    editor.commit();
}

/**********************************************************************************************
 * Liest die Daten für die Optionen mit Manager
 * Optionen für das Anzeigen der Adapter werden mit eingelesen
 *
 * @author robbisoft  @since 2. September 2021
 * @param
 * @return gesamelte Daten der Optionen
 * @exception
 * @throws
 **********************************************************************************************/
private TerminDaten laden(){
    TerminDaten termin = new TerminDaten();
    String str_pool = "";
    //Neue Optionen laden
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx);
    str_pool = pref.getString("key_termin_titel", "");
    termin.setTitel(str_pool);
    str_pool = pref.getString("key_terminbeschrieb", "");
    termin.setBeschrieb(str_pool);
    str_pool = pref.getString("key_terminort", "");
    termin.setOrt(str_pool);
    //Optionen für Adapter
    str_vor = pref.getString("key_vor", getResources().getString(R.string.lbl_dev_vor));
    str_nach = pref.getString("key_nach", getResources().getString(R.string.lbl_dev_nach));
    return  termin;
}

/**********************************************************************************************
 * Klasse um die Liste der Vorbereitung zu erstellen
 *
 * @author robbisoft  @since 4. September 2021
 * @param
 * @return
 * @exception
 * @throws
 **********************************************************************************************/
class VorAdapter extends ArrayAdapter<String>{

    public VorAdapter(@NonNull Context context, int resource) {
        super(context, resource);
    }

    @Override
    public int getCount() {
        return str_list_vor.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView != null){
            CheckBox chkb_obj_vor = (CheckBox) convertView.findViewById(R.id.chkb_vor);
            chkb_obj_vor.setText(str_list_vor.get(position));
        }else{
            convertView = getLayoutInflater().inflate(R.layout.layout_vor, null);
            CheckBox chkb_obj_vor = (CheckBox) convertView.findViewById(R.id.chkb_vor);
            chkb_obj_vor.setText(str_list_vor.get(position));
        }
        return convertView;
    }
}

/**********************************************************************************************
 * Klasse um die Liste der Nachbearbeitung zu erstellen
 *
 * @author robbisoft  @since 4. September 2021
 * @param
 * @return
 * @exception
 * @throws
 **********************************************************************************************/
class NachAdapter extends ArrayAdapter<String>{

    public NachAdapter(@NonNull Context context, int resource) {
        super(context, resource);
    }

    @Override
    public int getCount() {
        return str_list_nach.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView != null){
            CheckBox chkb_obj_nach = (CheckBox) convertView.findViewById(R.id.chkb_nach);
            chkb_obj_nach.setText(str_list_nach.get(position));
        }else{
            convertView = getLayoutInflater().inflate(R.layout.layout_nach, null);
            CheckBox chkb_obj_nach = (CheckBox) convertView.findViewById(R.id.chkb_nach);
            chkb_obj_nach.setText(str_list_nach.get(position));
        }
        return convertView;
    }
}

}

Beantworte die Frage als Erster