Smarthome App #6: Einstellungs-Bildschirm (2/2)


15.11.2016  |  Tutorial, Smarthome App

Im letzten Teil des Tutorials wurde das SettingsFragment designed und auch schon teilweise implementiert, der Rest der Implementierung wird jedoch in diesem Tutorial übernommen. Dabei steht heute unter anderem das Füllen der Liste im Vordergrund.

Das Video zum Tutorial

Damit die Liste mit Werten gefüllt werden kann, wird ein sogenannter Adapter benötigt, der jetzt implementiert wird. Dazu wird die Klasse "SettingsAdapter erstellt". Füge den folgenden Code in die Klasse "SettingsFragment" ein:
public class SettingsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    int lastPosition = -1;

    @Override
    public int getItemCount(){
        return settingItems.size();
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int i){
        if(holder instanceof SettingViewHolder){
            final SettingItem si = settingItems.get(i);
            SettingViewHolder settingViewHolder = (SettingViewHolder) holder;

            settingViewHolder.name.setText(si.getName());

            if(!si.getValue().equals("")){
                settingViewHolder.value.setText(Html.fromHtml(si.getValue()));
            }
            else settingViewHolder.value.setText("");

            settingViewHolder.icon.setImageResource(Icons.getSystemInfoIcon(si.getType()));

            View.OnClickListener ocl = si.getOnClickListener();
            if(ocl != null){
                settingViewHolder.container.setOnClickListener(ocl);
            }

            setAnimation(((SettingViewHolder) holder).container, i);
        }
    }

    public void setAnimation(View viewToAnimate, int position){
        if(position > lastPosition){
            Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.recycler_animation);
            viewToAnimate.startAnimation(animation);
            lastPosition = position;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.value_item, viewGroup, false);

        return new SettingViewHolder(itemView);
    }

    public class SettingViewHolder extends RecyclerView.ViewHolder{
        protected TextView value, name;
        protected ImageView icon;
        protected View container;

        public SettingViewHolder(View v){
            super(v);

            container = v.findViewById(R.id.container);
            value = (TextView) v.findViewById(R.id.value);
            name = (TextView) v.findViewById(R.id.name);
            icon = (ImageView) v.findViewById(R.id.icon);
        }
    }
}
In der Methode "onBindViewHolder()" der Klasse "SettingsAdapter", die jedes Listenelement darstellt, wenn es benötigt wird, wird die Methode "getSystemInfoIcon()" aufgerufen, die jedoch noch nicht existiert. Dies wird nun geändert. Öffne dazu die Datei mobile -> java -> de.smarthome_blogger.smarthome -> Icons und füge die folgenden neuen Methoden hinzu (darunter ist nicht nur die aufgerufene Methode, sondern auch zukünftig benötigte Methoden):
/**
 * Gibt anhand des &uuml;bergebenene Key's den passenden Icon zur&uuml;ck
 * @param key
 * @return
 */
public static int getSystemInfoIcon(String key){
    switch(key){
        default:
            return R.mipmap.ic_launcher;
    }
}

/**
 * Gibt anhand des &uuml;bergebenen Key's den passenden Icon zur&uuml;ck
 * @param key
 * @return
 */
public static int getValueIcon(String key){
    switch(key){
        default:
            return R.mipmap.ic_launcher;
    }
}

/**
 * Gibt anhand des &uuml;bergebenen Key's den passenden Icon zur&uuml;ck
 * @param key
 * @return
 */
public static int getDeviceIcon(String key){
    switch(key){
        default:
            return R.mipmap.ic_launcher;
    }
}
Als letzter Schritt vor dem ersten Test der App wird noch ein kleiner Fehler behoben. Dazu öffnest du die Datei mobile -> res -> layout -> value_item.xml und änderst im FrameLayout-Tag die Zeile
android:layout_height="match_parent"
um in:
android:layout_height="wrap_content"
Wegen diesem Fehler waren die einzelnen Elemente im SettingsFragment so groß wie der Bildschirm und deswegen wurden immer nur 2 Elemente angezeigt. Jetzt sind die Elemente wie gewünscht so groß, wie in der Datei dimens.xml unter dem Punkt "recyclerItemHeight" definiert.

Die App auf dem Emulator testen

Um den Emulator zu starten klickst du in der Leiste oben auf den großen grünen Pfeil.
Mit dem grünen Pfeil startest du den Emulator.
Daraufhin öffnet sich eine Übersicht mit allen angelegten virtuellen Geräten. Falls du noch keins angelegt hast, wählst du unten "Create new virtual device".
Hier werden alle virtuellen Geräte aufgelistet.
Hier kannst du dir nun ein Modell aussuchen.
In diesem Fenster findest du eine Liste vieler verschiedener Modelle.
Eine Betriebssystemversion kannst du dir nach einem Klick auf "Next" aussuchen.
Hier findest du eine Liste an Betriebssystemversionen.
Nach einem weiteren Klick auf "Next" kannst du das Gerät genauer definieren (ist nicht unbedingt nötig) und die Erstellung mit einem Klick auf "Finish" abschließen.
Das Gerät kannst du hier konfigurieren.
Nach kurzer Ladezeit sollte der Emulator starten und nach einem mehr oder weniger schnellen Startvorgang solltest du einen Android Homescreen sehen, auf dem nach ein paar Augenblicken die Smarthome App startet. Hier kannst du nun im Hauptmenü den Punkt "Einstellungen" anklicken und der Einstellungs-Bildschirm sollte in etwa so aussehen, wie auf dem folgenden Bild.
So sollte das SettingsFragment aussehen.
Bei Fragen oder Problemen kannst du mir gerne einen Kommentar hinterlassen.

Über den Autor


Sascha Huber

Hallo, ich bin Sascha, der Gründer von Smarthome Blogger.

Mit einer Leidenschaft für Technologie und einem Hintergrund als Software Engineer habe ich 2016 Smarthome Blogger gegründet. Mein Ziel war es schon immer, innovative Lösungen zu entdecken, die unser Leben einfacher und intelligenter gestalten können. In meinem beruflichen Leben arbeite ich täglich mit Software und Technik, aber auch in meiner Freizeit bin ich stets auf der Suche nach neuen technischen Spielereien und Möglichkeiten, mein Zuhause zu automatisieren und zu verbessern.

Auf Smarthome Blogger teile ich mein Wissen, meine Erfahrungen und meine Begeisterung für alles rund um das Thema Smarthome.



Dieser Beitrag hat dir gefallen?

Dann abonniere doch unseren Newsletter!