2017-12-11 2 views
-1

Ich habe eine ListView mit benutzerdefinierten Zeilen. Sie haben verschiedene Hintergrundfarben, Set ind der getView() Methode eines ArrayAdapter:Markieren Sie eine Zeile mit einfacher Animation in einem Android ListView

public View getView(int position, View convertView, ViewGroup parent) { 
    ... 
    bgResourceId = R.color.white; 
    if (items.get(position).status.contentEquals("ok")) { 
     bgResourceId = R.color.green; 
    } else items.get(position).status.contentEquals("error")) { 
     bgResourceId = R.color.red; 
    } 
    row.setBackgroundResource(bgResourceId); 
    return row; 
} 

Ein Klick auf eine Zeile startet eine neue Aktivität. Nachdem wir die neue Activity abgeschlossen haben, kehren wir zur Activity mit der ListView zurück und an dieser Stelle muss ich eine der Zeilen markieren.

Innerhalb der onResume() Methode, NICHT nach dem Berühren oder Klicken auf die Zeile. Ich weiß, welche Zeile (Index) wird highlihgted.

Nur eine einfache Animation - vielleicht für eine Sekunde blinken, und danach zu seiner ursprünglichen Hintergrundfarbe zurückkehren. Etwas wie folgt aus:

enter image description here

Ist das möglich?

+2

* Ist das möglich * ... ja, es ist – Selvin

+0

Folgen [Dies] (https://stackoverflow.com/questions/ 5058291/highlight-listview-selected-row) und fügen Sie eine benutzerdefinierte Animation in der Ansicht hinzu. – ADM

+0

Danke @Selvin, können Sie mir bitte sagen, wie es geht? – Dusan

Antwort

0

Dies ist nicht so trivial wie es scheinen mag. Sie müssen

  1. Stellen Sie sicher, dass das Timing richtig ist. onResume können Sie noch nicht auf Objektansichten zugreifen, daher sollten Sie onWindowsFocusChanged verwenden. Setzen Sie diese in Ihrer Aktivität:

    Handler handler = new Handler(); 
    int blink = 4; 
    int regularBg = android.R.color.holo_orange_light; 
    int blinkingBg = android.R.color.holo_orange_dark; 
    
    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
        super.onWindowFocusChanged(hasFocus); 
        if (hasFocus) { 
         final View view = adapter.getViewByPosition(blink, listView); 
         view.setBackgroundResource(blinkingBg); 
         handler.postDelayed(new Runnable() { 
          @Override 
          public void run() { 
           view.setBackgroundResource(regularBg); 
           listView.setOnScrollListener(null); 
          } 
         }, 1000); 
        } 
    } 
    
  2. Zugang Artikelansichten über eine benutzerdefinierte Methode, die Sie mit dem Adapter hinzufügen (wird nicht funktionieren, durch die regelmäßige getView). Es ist von über here.

    View getViewByPosition(int pos, ListView listView) { 
        final int firstListItemPosition = listView.getFirstVisiblePosition(); 
        final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 
    
        if (pos < firstListItemPosition || pos > lastListItemPosition) { 
         return listView.getAdapter().getView(pos, null, listView); 
        } else { 
         final int childIndex = pos - firstListItemPosition; 
         return listView.getChildAt(childIndex); 
        } 
    } 
    
  3. Stellen Sie sicher, dass das Element, das Sie hervorheben möchten unter allen Umständen sichtbar ist. Wenn Sie dies nicht garantieren können, weil es sehr kleine Geräte gibt oder das Objekt, das Sie hervorheben möchten, weiter unten in der Liste ist als in der Liste, die Sie in Ihrer Frage anzeigen, müssen Sie zuerst zur richtigen Position scrollen. Erst nachdem der Bildlauf abgeschlossen ist, können Sie den Hintergrund des Objekts ändern. Daher müssten Sie eine onScrollListener für Ihre ListView implementieren. Für den Moment, bis Sie mir etwas anderes sagen, nehme ich an, dass dies nicht notwendig ist.

Hier ist, wie es aussieht:

enter image description here

+0

Eigentlich scrolle ich die Ansicht in onResume() an die richtige Position; Ich werde es versuchen und Sie wissen lassen. – Dusan

+0

Nicht genau wie ich es mir vorgestellt habe, aber es ist ein guter Ausgangspunkt. Danke für Ihre Hilfe. – Dusan

Verwandte Themen