Logik in Adapter

  • Antworten:7
Robbiani Renato
  • Forum-Beiträge: 606

19.07.2022, 20:55:11 via Website

Hallo zusammen

Ich möchte in meiner App dem Adapter etwas Logik hinterlegen. Dazu habe ich dem Layout eine Activity angehängt. Doch es will nicht funktionieren. Wenn ich mit dem Debuger durchgehe, wir der Code nicht ausgeführt.

Layout:

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

Activity:

package ch.robbisoft.sakristanhilfe;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;

public class vorbereitung extends AppCompatActivity {

private CheckBox obj_check;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_vor);

    obj_check = findViewById(R.id.chkb_vor);
    obj_check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            CheckBox temp_box;
            temp_box = (CheckBox) view;
            if(temp_box.isChecked()){
                temp_box.setChecked(false);
            }else {
                temp_box.setChecked(true);
            }
        }
    });
}

}

MainActivity:

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.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
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.findViewById(R.id.chkb_vor);
            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önig und den Advent
 * Korrektur der Weiheinachtszeit
 *
 * @autor robbisoft @version 2.1.2022
 * @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.isZweiNeujahr(jetzt)){
tbar.setBackgroundColor(Color.WHITE);
tbar.setTitle(getResources().getString(R.string.lbl_btag));
}
if( feste.isDreikonig(jetzt) ){
tbar.setBackgroundColor(Color.WHITE);
tbar.setTitle(getResources().getString(R.string.lbl_konig));
}
if(feste.isMariaLicht(jetzt)){
tbar.setBackgroundColor(Color.WHITE);
tbar.setTitle(getResources().getString(R.string.lbl_marialicht));
}
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();
//Prüfen ob das wirklich so Stimmt
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));
}
}
//Prüfe auf Weihnachten
if(feste.isHeiligabend(jetzt)){
tbar.setBackgroundColor(Color.WHITE);
tbar.setTitle(getResources().getString(R.string.lbl_heilabend));
}
if(feste.isWeihnachten(jetzt)){
tbar.setBackgroundColor(Color.WHITE);
tbar.setTitle(getResources().getString(R.string.lbl_weihnacht));
}
if(feste.isStefanstag(jetzt)){
tbar.setBackgroundColor(Color.RED);
tbar.setTitle(getResources().getString(R.string.lbl_stefan));
}

    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);
getTerminResult.launch(was);
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);
getOptResult.launch(opt);
return true;
}
default: return super.onOptionsItemSelected(item);
}
}

ActivityResultLauncher<Intent> getOptResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result.getResultCode() == Activity.RESULT_OK){
                    //Neuer Optionenaufruf
                    optionen = laden();
                    listebauen();
                }
            }
        });

ActivityResultLauncher<Intent> getTerminResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result.getResultCode() == Activity.RESULT_OK) {
                    //Speichern der Termine!
                }
            }
        });

ActivityResultLauncher<Intent> getWorkResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
        new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                if(result.getResultCode() == Activity.RESULT_OK){
                    try{
                        Intent inhalt = result.getData();
                        if(inhalt != null) {
                            String str_datum, str_text;
                            str_datum = inhalt.getStringExtra("datum");
                            str_text = inhalt.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;
                }
            }
        });

@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);
getWorkResult.launch(param);
}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();
}
}
};

/**********************************************************************************************
 * 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;
    }
}

}

Ich bin mir nicht sicher, ob ich nicht auf dem falschen Pferd sitze. Kann ich einem Adapter logik hinterlegen? Fals ja wie muss man das machen.

Gruss Renato

Kommentieren
Jokel
  • Forum-Beiträge: 1.529

21.07.2022, 05:36:25 via Website

Ohe den code angesehen zu haben. Wäre es sinnvoll zu sagen was du erwartest was du machen willst oder was genau nicht geht.

Hilfreich?
Rafael K.
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 606

21.07.2022, 19:58:11 via Website

Ciao Jokel

Du hast Recht. Entschuldige.

Also die Idee mit der Activity funktioniert nicht. Aber ich habe im Internet was gefunden.

list_nach.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            CheckBox objekt = (CheckBox) view;
            objekt.setChecked(!objekt.isChecked());
        }
    });

Ich habe den Code implementiert. Leider tut sich immer noch nichts. Wenn ich mit dem Debugger ein Breakpoint setze wird der Code nicht ausgeführt. Irgend wie kommt das Programm dort nicht vorbei.

Das eigentliche Problem ist folgendes. Ich habe ein Adapter mit CheckBoxen. Wenn ich eine CheckBox anklicke, dann wird der Hacken gesetzt. Wenn die Liste länger ist als der Bildschirm, dann wird nicht nur der Aktuelle Checkbox aktiviert. Der erste Eintrag im unsichtbaren Bereich ist dann ebenfalls aktiv. Wenn ich nun nach oben scrolle um den Hacken wieder zu entfernen. Dann ist der obere Hacken ebenfalls wieder verschwunden.
Darum suche ich eine Möglichkeit, dass im Adapter immer nur der aktuelle Hacken gesetzt wird.

Gruss Renato

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

29.08.2022, 17:13:22 via Website

Hallo Renato,

dir ist schon klar wie ListViews in Android funktionieren oder?
Du musst in deiner Datenhaltung dir den Status der CheckBox selbst speichern und beim "getView" im Adapter wiederherstellen. Die ListView speichert das nicht für dich. (Generell keine gute Idee Views irgenwas speichern zu lassen!)

Das bedeutet du musst für jeden Listeneintrag speichern ob die CheckBox nun angehakt ist oder nicht. Das anhaken musst du als check/click Listener auf der CheckBox machen und nicht auf der ListView.

Somit brauchst du ein eine Map bzw. Liste von Tupeln wobei der String dein Listeneintrag ist und der boolean dir sagt, ob die checkBox jetzt gesetzt ist oder nicht.
Da du das in deiner jetzigen Struktur nicht mehr speichern kannst, empfehle ich dir, das nicht mehr String basiert zu machen (jeder DEV der den Code lies wäre dir Dankbar ;) sondern ein Objekt aka. MAP zu nehmen und die in den Prefs nur noch als Json zu speichern. Speichern und Laden der Daten wären nur noch 2 Zeilen und dein ganzes String Parsing gedöns fliegt einfach raus. Macht alles übersichtlicher.

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

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

10.09.2022, 20:49:35 via Website

Danke Pascal für deine super Tipps. Da muss ich wohl oder übel meine App umbauen.

Gruss Renato

Hilfreich?
Pascal P.
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 606

14.11.2022, 21:54:26 via Website

Ciao Pascal

Ich versuche deine Antwort in die Tat umzusetzen. Ich verstehe nicht ganz wie ich das umsetzen soll. Wenn ich nach "Map" suche, dann kommen immer Beispiele wie man eine Karte auf dem Handy zeigt. Aber das ist es bestimmt nicht.

Kannst du mir das vorgehen noch ein bisschen genauer erklären. Oder hast du mir ein Beispiel?

Also wie ich dich verstehe, schmeisse ich mal die Adapter raus. Für die Jeckboxen erstelle ich ein Objekt mit dem Text und ob der Hacken sichtbar ist oder nicht. Wie bringe ich nun alles aufs Display?

Gruss Renato

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

15.11.2022, 17:22:04 via Website

Hallo mit Map hat Pascal das Java Collection Feamework gemeint.
Map, Hashmap, Set,....

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/package-summary.html#CollectionsFramework

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Map.html

— geändert am 15.11.2022, 17:46:31

Hilfreich?
Pascal P.
Kommentieren
Jokel
  • Forum-Beiträge: 1.529

16.11.2022, 11:28:25 via Website

Hallo ich habe mir mal deinen Quellcode mal angesehen.

Ich sehe nicht in deinen Code wo du so was wie eine Liste ,Array an den Adapter gibst .
Eigentlich hast du besser der Adapter gar keine Daten die er Anzeigen kann.

adapter_vor = new VorAdapter(ctx, 0); // der Adapter hat keine Liste (Daten) die er Anzeigen kann.

Du übergibst nichts den Context ok aber Liste mit Daten Fehlanzeige. Du hast nur ein einfaches int

public NachAdapter(@NonNull Context context, int resource) // sollte eine Liste übergeben werden

Da wird eine Liste erwartet. Von welchen Typ auch immer am einfachsten ein String oder eine eigene Daten Klasse. In der kannst du dann auch deine Checkbox halten.

Wahrscheinlich wolltest du da die Liste „str_list_vor“ an der Adapter übergeben.

Hilfreich?
Kommentieren