Custom ListView - wie begrenzen?

  • Antworten:6
pepperonas
  • Forum-Beiträge: 434

27.10.2014, 08:07:09 via Website

Hallo,
ich möchte mittels einer Custom ListView eine RingtonePreference nachbauen da die normale, also von Android bereitgestellte, sich nicht themen lässt.
So gesehen funktioniert alles. Bis auf die Kleinigkeit, dass ich schwer mit Darstellungsfehlern zu kämpfen habe.
Sprich die Liste wird zwar dargestellt, aber je nach Gerät kann es sein, dass entweder ein Teil unten abgeschnitten wird (das ist sehr schlecht, dann kann man nämlich nicht "OK" drücken, um den Warnton auszuwählen) oder die View ist verschoben und zeigt oben ein paar Einträge an, in der Mitte dann die Überschift (DialogTitle) und unten wieder ein paar Einträge. Das ist natürlich ebenso Mist. Gerade weil dann noch dazu kommt, dass wenn man auf die oberen Einträge klickt die Liste einfach "abhaut" :D

Habe jetzt schon ein paar lange Nächte dran gesessen und stehe am Rand der Verzweiflung. Es kann doch nicht so schwierig sein, einfach nur eine Liste umzuthemen?! oO

Hier der Code:

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

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="500dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:textColor="@color/white"
        android:textSize="22sp"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="8dp"
        android:background="@color/blue_app_color"/>

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:listSelector="@color/blue_app_color"/>

</LinearLayout>

</LinearLayout>

Und hier die Methode, die die Liste "erstellen" soll...

 @Override
protected View onCreateDialogView() {

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    SharedPreferences.Editor editor = preferences.edit();
    String mThemeSettings = MyVars.THEME_KEY_DEFAULT;

    // Theme-Einstellungen
    if (preferences.contains(MyVars.SETTING_THEME)) {
        mThemeSettings = preferences.getString(MyVars.SETTING_THEME, MyVars.THEME_KEY_DEFAULT);
    } else {
        editor.putString(MyVars.SETTING_THEME, mThemeSettings);
        editor.apply();
    }

    // View f&uuml;r R&uuml;ckgabe anlegen
    View view;

    if (mThemeSettings.equals(MyVars.THEME_KEY_2)) {
        view = View.inflate(mContext, R.layout.custom_list_preference_black, null);
    } else view = View.inflate(mContext, R.layout.custom_list_preference_white, null);

    mDialogTitle = getDialogTitle();
    if (mDialogTitle == null) mDialogTitle = getTitle();
    ((TextView) view.findViewById(R.id.dialog_title)).setText(mDialogTitle);

    ListView list = (ListView) view.findViewById(android.R.id.list);


    ArrayAdapter<CharSequence> adapter;
    if (mThemeSettings.equals(MyVars.THEME_KEY_2)) {

        adapter = new ArrayAdapter<CharSequence>(
                getContext(), R.layout.btn_radio_black,
                getEntries());
    } else {
        adapter = new ArrayAdapter<CharSequence>(
                getContext(), R.layout.btn_radio_white,
                getEntries());
    }

    // Adapter setzen
    list.setAdapter(adapter);
    // Achtung: vorher Clickable setzen, sonst werden die Vorgaben nicht angenommen...
    list.setClickable(true);
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    list.setItemChecked(findIndexOfValue(mPath), true);
    list.setOnItemClickListener(this);

    return view;
}

Bin für jede Hilfe dankbar.

Beste Grüße
Martin

— geändert am 27.10.2014, 08:08:07

Open Source

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

27.10.2014, 08:10:01 via App

Vielleicht reicht es ja schon die Höhe des ganzen zu beschränken. Dann sollte sich der rest doch anpassen oder?

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

Antworten
pepperonas
  • Forum-Beiträge: 434

27.10.2014, 08:36:48 via Website

Wie meinst du? Im äußeren Layout setze ich die Höhe ja bereits auf 500dp... Wenn ich sie weiter herabsetze, wird die Liste 2 geteilt. :-/
Ich stelle gleich mal ein paar Bilder ein...

Wobei du nicht ganz unrecht hast. Wenn ich auf 100dp gehe passen die Buttons des Dialogs wieder auf den Bildschirm. Aber wo liegt nun der Fehler der 2-Teilung? ^^

image

— geändert am 27.10.2014, 08:55:35

Open Source

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

27.10.2014, 09:12:37 via App

Das problem ist, wenn du die größe Festlegst, dann ist sie überall 100 und das mach nicht immer sinn.
Es muss eine möglichkeit geben. Leider weiss ich diese nicht...
Gibts kein tut darüber?

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

Antworten
pepperonas
  • Forum-Beiträge: 434

27.10.2014, 09:19:33 via Website

Jo, so denke ich mir es auch... Leider nichts gefunden. :-/
Trotzdem Danke, ist ja auch kein alltägliches Problem :)

Ich probiere es weiter und sage Bescheid, wenn ich was herausgefunden habe...

Open Source

Antworten
pepperonas
  • Forum-Beiträge: 434

27.10.2014, 11:05:25 via Website

Ajo, ich glaub ich habs hinbekommen. Getreu nach dem Motto: "Wenn schon Custom, dann richtig" bin ich nun davon abgekommen die Logik des Dialogs zu nutzen (auch wenn es sich hier ja offensichtlich angeboten hätte) und nehme stattdessen einfach meine eigenen Buttons mit dem guten alten onClickListener -> failsafe! :D

Jo, hat funktioniert.

Den Ausstieg habe ich jetzt wie folgt gelöst:

 @Override
    protected void onDialogClosed(boolean positiveResult) {

        if (positiveResult) {
            if (MyVars.DMODE) Log.d(TAG, "pos");
            mTmpPath = mPath;
            mTmpActivePositionInList = mActivePositionInList;
            setNewValue(mPath, mActivePositionInList);
            super.onDialogClosed(positiveResult);
        }
        if (!positiveResult) {
            if (MyVars.DMODE) Log.d(TAG, "neg");
            mPath = mTmpPath;
            mActivePositionInList = mTmpActivePositionInList;
            setStoredValue();
            super.onDialogClosed(!positiveResult);
        }

    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_accomplish_sound:
                Log.d(TAG, "Sound soll gespeichert werden.");
                onDialogClosed(true);
                getDialog().dismiss();
                break;

            case R.id.btn_cancel_sound_setting:
                Log.d(TAG, "Sound soll NICHT gespeichert werden");
                onDialogClosed(false);
                getDialog().dismiss();
                break;

        }
    }

Ist zwar ein bisschen umständlich(er) und vielleicht auch doppelt-gemoppelt, aber der Ablauf sollte so jedenfalls gewahrt bleiben.. (jedenfalls so meine Vermutung auf die Schnelle)

— geändert am 27.10.2014, 11:19:19

Open Source

Antworten
pepperonas
  • Forum-Beiträge: 434

27.10.2014, 14:57:03 via Website

Hehe, jetzt gibts aber schon wieder das nächste Problem...
Ist ein Eintrag in einer Liste gewählt wird er farblich markiert. Leider kommt es nicht gerade selten vor, dass beim Scrollen durch die Liste Darstellungsfehler erfolgen. Teilweise werden sogar Reihen "halb" ausgefüllt. Ist ein bisschen komisch zu beschreiben, aber da ja Bilder mehr sagen, als 1000 Worte. Hier ein Beispiel:
image

Wenn jemand weiß an was so was liegen kann, darf er mich das gerne wissen lassen. :)

Open Source

Antworten