# ListView aktuallisiert sich nicht



## Lucaaa (11. Nov 2018)

Hallo!
Meine ListView aktuallisiert sich nach dem löchen eines Items nicht
Warum?


```
package com.ludevstudio.schoolmanager;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.ludevstudio.schoolmanager.Elements.Schedule;
import com.ludevstudio.schoolmanager.data.SchedulesSrc;
import com.ludevstudio.schoolmanager.dialogs.SchedulesOptions;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

import static android.widget.Toast.makeText;


public class SchedulesFragment extends Fragment {
    // Buttons
    FloatingActionButton btnAddSchedule;

    // Schedule add variables

SchedulesFragment thisFragment = this;

ArrayList<Schedule> schedules = new ArrayList<Schedule>();

   ListView listSchedules;


ListAdapter adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         return inflater.inflate(R.layout.fragment_schedules, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        initUI();

    }

    private void initUI() {
        btnAddSchedule = (FloatingActionButton) getView().findViewById(R.id.btn_add_schedules);
        btnAddSchedule.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               Snackbar sBar = new DialogAddSchedule(thisFragment).get();
               sBar.show();
            }
        });

        // load all schedules from database and visualize it in a listview
        loadSchedules();
        listSchedules = (ListView) getView().findViewById(R.id.schedules_list);
      adapter =new ListAdapter(this.getActivity(), loadScheduleNames());
          listSchedules.setAdapter(adapter);


    }

    public ArrayList<String> loadScheduleNames() {
        ArrayList<String> list =new ArrayList<String>();

        for(Schedule s : schedules) {
            list.add(s.getName());
        }
        return list;
    }


    public class ListAdapter extends BaseAdapter {
        private Context context;
        private ArrayList<String> list =new ArrayList<String>();


        public ListAdapter(Context context, ArrayList<String> list) {
            this.context = context;
            this.list= list;
        }

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

        }

        @Override
        public Object getItem(int i) {
            return list.get(i);
        }

        @Override
        public long getItemId(int i) {
            return 1L;
        }

        @Override
        public View getView(final int i, View convertView, ViewGroup viewGroup) {
          View view = convertView;
        // create view
          if(view==null) {
              LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              view = inflater.inflate(R.layout.schedules_list_item, null);
          }
          // init Elements
            TextView twTitle = (TextView) view.findViewById(R.id.schedules_list_item_text);
          twTitle.setText(list.get(i));

          Button btnMenu = (Button) view.findViewById(R.id.schedules_list_item_button);
          btnMenu.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  SchedulesOptions dialog =new SchedulesOptions(getActivity(), schedules, schedules.get(i), adapter, listSchedules);
                  dialog.get().show();
              }
          });

          return  view;
        }
    }

    private void loadSchedules() {
        SchedulesSrc src =new SchedulesSrc(getActivity());
        src.open();
        schedules = src.getAll();
        src.close();
    }
}
```


```
package com.ludevstudio.schoolmanager.dialogs;

import android.app.Activity;
import android.content.Context;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.CardView;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.ludevstudio.schoolmanager.Elements.Schedule;
import com.ludevstudio.schoolmanager.MainActivity;
import com.ludevstudio.schoolmanager.R;
import com.ludevstudio.schoolmanager.SchedulesFragment;

import java.lang.reflect.Array;
import java.util.ArrayList;

public class SchedulesOptions {
    Context context;

    Button btnClose;
    CardView btnEdit, btnClone, btnDelete;

ArrayList<Schedule> schedules;
Schedule schedule;
    SchedulesFragment.ListAdapter adapter;
    ListView listView;

    public SchedulesOptions(Context context, ArrayList<Schedule> schedules, Schedule schedule,
                            SchedulesFragment.ListAdapter adapter, ListView listView) {
        this.context = context;
        this.schedule = schedule;
        this.schedules = schedules;
        this.adapter = adapter;
        this.listView = listView;
    }

    public Snackbar get() {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View dialogView = inflater.inflate(R.layout.dialog_schedules_options, null);
        View rootView = ((Activity)context).getWindow().getDecorView().findViewById(android.R.id.content);
       View contextView =   inflater.inflate(R.layout.fragment_schedules, null);
   //    View rootView = contextView.findViewById(R.id.schedules_roor);

       final Snackbar sBar = Snackbar.make(rootView, "hello World", Snackbar.LENGTH_INDEFINITE);
        Snackbar.SnackbarLayout sBarView = (Snackbar.SnackbarLayout) sBar.getView();
        TextView sTw = (TextView) sBarView.findViewById(android.support.design.R.id.snackbar_text);
        sTw.setVisibility(View.INVISIBLE);
        sBarView.setPadding(0,0,0,0);
        sBarView.addView(dialogView);

        initUI(sBar, dialogView);
        return sBar;
    }

    private void initUI(final Snackbar s, View v) {
        btnClose = (Button) v.findViewById(R.id.schedulesoptions_btn_close);
        btnClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                s.dismiss();
            }
        });

        btnEdit = (CardView) v.findViewById(R.id.schedulesoptions_btn_edit);
        btnClone = (CardView) v.findViewById(R.id.schedulesoptions_btn_clone);
        btnDelete = (CardView) v.findViewById(R.id.schedulesoptions_btn_delete);

    btnDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            schedules.remove(schedule);
            adapter.notifyDataSetChanged();
            listView.invalidateViews();
            listView.invalidate();
            Toast.makeText(context, "gelöscht  "+schedules.size(), Toast.LENGTH_LONG).show();
        }
    });

    }

}
```


----------



## mihe7 (12. Nov 2018)

Weil Du aus der Liste, die der Adapter erhält, nichts entfernst.


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Weil Du aus der Liste, die der Adapter erhält, nichts entfernst.


Danke!

Für die Nachwelt:
- ListAdapter Klasse ine Setlist Methode hinzügefügt.
- liste beim Löchen neu übergeben, bzw element ersetzt (gelöscht)


----------



## mihe7 (13. Nov 2018)

Warum verwendest Du im Adapter nicht einfach die selbe Liste (schedules)?


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Warum verwendest Du im Adapter nicht einfach die selbe Liste (schedules)


Weil Schedules eine Liste aus Schedule Objekten ist, und der Adapter nimmt Strings.


----------



## mihe7 (13. Nov 2018)

Und warum nimmt der Adapter nicht Schedule-Objekte?


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Und warum nimmt der Adapter nicht Schedule-Objekte?


Weil der Code sagt, das er Strings nehmen soll.
Wie kriege ich den denn den adapter dazu, aus einem Schedule Objekt den Namen zu lesen?
mit toString() in der Schedule Klasse?


----------



## mihe7 (13. Nov 2018)

Lucaaa hat gesagt.:


> Wie kriege ich den denn den adapter dazu, aus einem Schedule Objekt den Namen zu lesen?


Genauso wie Du das in loadScheduleNames machst.


```
private ArrayList<Schedule> list =new ArrayList<Schedule>();
...
@Override
public Object getItem(int i) {
    return list.get(i).getName();
}
```

Da deine ListAdapter-Klasse noch nicht mal static ist, könntest Du sogar direkt auf schedules zugreifen.


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Genauso wie Du das in loadScheduleNames machst.


Habe ich jetzt
Das macht die Sache natürlich einfacher.
Ich danke dir


----------



## mihe7 (13. Nov 2018)

Jetzt weißt Du, warum das Ding "Adapter" heißt


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Jetzt weißt Du, warum das Ding "Adapter" heißt


Ich könnte es umbenennen...


----------



## mihe7 (13. Nov 2018)

Lucaaa hat gesagt.:


> Ich könnte es umbenennen...


Ich meinte nicht Deine Klasse, sondern warum das Teil in Android Adapter heißt.


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Ich meinte nicht Deine Klasse, sondern warum das Teil in Android Adapter heißt.


Weiß ich


----------



## mihe7 (13. Nov 2018)

Fieser Möp.


----------



## Lucaaa (13. Nov 2018)

mihe7 hat gesagt.:


> Fieser Möp.


-> https://www.java-forum.org/thema/stundenplan-wie-umsetzen.183138/


----------



## mihe7 (13. Nov 2018)

@Lucaaa das habe ich schon gesehen, allerdings bin ich mit Android nicht so vertraut, als dass ich da eine Aussage treffen möchte. Es wird sich schon noch einer melden, der davon weit mehr Ahnung hat.


----------

