2016-05-17 10 views
1

In einer Activity, wie bekomme ich Zugriff auf die erste Gruppenansicht von Expandable ListView? HierGet handle von Ansicht der ersten Gruppe von Expandable ListView

ist, was ich tue:

public int getFirstVisibleGroup() { 
     LogUtil.i(TAG, "getFirstVisibleGroup called"); 
     int firstVis = listView.getFirstVisiblePosition(); 
     LogUtil.i(TAG, "firstVis = " + firstVis); 
     long packedPosition = listView.getExpandableListPosition(firstVis); 
     LogUtil.i(TAG, "packedPosition = " + packedPosition); 
     LogUtil.i(TAG, "firstVisibleGroup = " + ExpandableListView.getPackedPositionGroup(packedPosition)); 
     return ExpandableListView.getPackedPositionGroup(packedPosition); 
    } 

    public View getGroupView(ExpandableListView listView, int groupPosition) { 
     LogUtil.i(TAG, "getGroupView called"); 
     int flatPosition = listView.getFlatListPosition(groupPosition); 
     LogUtil.i(TAG, "flatPosition = " + flatPosition); 
     int first = getFirstVisibleGroup(); 
     LogUtil.i(TAG, "first = " + first); 
     LogUtil.i(TAG, "returning child at position " + (flatPosition - first)); 
     return listView.getChildAt(flatPosition - first); 
    } 

Und ich nenne es mit:

View view = getGroupView(listView, 0); 

Letztlich wird es listView.getChildAt(0). Und die zurückgegebene view ist null.

Was ist der richtige Weg?

+0

Wann versuchen Sie 'listView.getChildAt (0)' aufzurufen? Ist das zwischen onCreate/onResume oder nachdem der Benutzer auf die Ansicht geklickt hat? – Budius

+0

@Budius in 'onCreate()', mache ich einen Service-Anruf und wenn das Ergebnis des Service-Aufrufs gekommen ist, aktualisiere ich die 'Expandable ListView' und danach rufe ich die obige Methode auf. –

Antwort

1

Alle auf dem Adapter basierenden Ansichten (ListView, GridView, RecyclerView) fügen die Ansichten erst hinzu, nachdem sie auf dem Bildschirm angezeigt wurden. So können sie die passende Größe berechnen und genügend Kindansichten abfragen.

Aus diesem Grund, während onCreate werden Sie nie nie irgendwelche Ansichten. Das heißt, wenn Sie mit einigen seiner untergeordneten Ansichten interagieren möchten, muss dies später geschehen.

Ein geeigneter Ansatz besteht darin, den Listener OnPreDraw zu verwenden. Das ist direkt bevor das System draw(canvas) auf den Ansichten aufruft. Beispiel:

public MyActivity extends Activity implements ViewTreeObserver.OnPreDrawListener { 

    @Override 
    public void onCreate(bundle){ 
     ... build your layout and your listview 

     // during onCreate you add a PreDrawListener 
     rootView.getViewTreeObserver().addOnPreDrawListener(this); 
    } 

    @Override 
    public void onPreDraw() { 

     ... do your logic here !!! 


     rootView.getViewTreeObserver().removeOnPreDrawListener(this); // remove itself, you only need the fist pass 
     return true; // must return true, or else the system won't draw anything. 
    } 

} 
+0

Ich bekomme immer noch die 'Ansicht' als' null'. Außerdem wird 'onPreDraw()' aufgerufen, noch bevor die Netzwerkantwort kommt. –

+0

oh ... Ich glaube, ich habe den Teil vermisst, wo du über Netzwerk gesagt hast. Aber die Idee ist die gleiche, es ist ein 'PreDraw', es wird direkt aufgerufen, bevor es erneut auf dem Bildschirm gezeichnet wird. Das heißt, in Ihrem Fall sollten Sie 'addOnPreDrawListener' direkt nach dem Aufruf von' setAdapter' oder 'notifyDataSetChanged' hinzufügen. – Budius

+0

Ok. Ich werde das versuchen. –