2013-08-27 5 views
17

Für eine App, an der ich arbeite, versuche ich, die Kinder eines ListView zu bekommen. Um dies zu tun, habe ich das folgende Stück Code:Get ListView Kinder, die nicht in Sicht sind

View listItem = mListView.getChildAt(i); 

Allerdings funktioniert dies nur für Kinder, die im Blick sind. Ich muss auch die Kinder erreichen, die nicht im Blick sind. Wie würde ich das tun?

EDIT:

die vorgeschlagenen Methoden zu der einen Vergleich war ich schon mit finde ich folgendes:

RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView); 
RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i); 
Log.d("Checks", "listItem1: " + listItem1); 
Log.d("Checks", "listItem2: " + listItem2); 

08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.628: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.638: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem1: [email protected] 
08-27 14:16:56.648: D/Checks(15025): listItem2: [email protected] 

listItem2 zeigt auf die aktuelle Ansicht in der Listview, das, was ich will außer dass es nur für Ansichten funktioniert, die in Sichtweite sind. Sie können aus der Protokolldatei sehen, dass listItem1 und listItem2 nicht übereinstimmen.

EDIT 2:

kam ich mit dem Follow-up:

for (int i = 0; i < mListView.getCount(); i++) { 
    RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView); 
} 

Dies gibt die Ansichten richtig für alle sichtbaren Elemente in der Liste. Es gibt jedoch eine andere Ansicht für diejenigen, die nicht in Sicht sind.

EDIT 3:

Dank nfirex ich eine Arbeits Antwort. Dies wird Ansichten zurück, auch wenn sie nicht direkt in Sicht sind:

public View getViewByPosition(int position, ListView listView) { 
    final int firstListItemPosition = listView.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 

    if (position < firstListItemPosition || position > lastListItemPosition) { 
     return listView.getAdapter().getView(position, listView.getChildAt(position), listView); 
    } else { 
     final int childIndex = position - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 

Antwort

33

Sie Methode benötigen Adapter.getView():

final View view = mListView.getAdapter().getView(position, null, mListView); 

UPDATE:

Sie benötigen eine Methode zu erstellen. Etwas wie folgt aus:

public View getViewByPosition(int position, ListView listView) { 
    final int firstListItemPosition = listView.getFirstVisiblePosition(); 
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1; 

    if (position < firstListItemPosition || position > lastListItemPosition) { 
     return listView.getAdapter().getView(position, null, listView); 
    } else { 
     final int childIndex = position - firstListItemPosition; 
     return listView.getChildAt(childIndex); 
    } 
} 
+2

Dies gibt tatsächlich eine Ansicht zurück. Ich denke jedoch, dass es eine neue Ansicht anstelle der tatsächlichen, die ich will, zurückgibt. – Zero

+0

@Zero Welche Ansicht müssen Sie abrufen? Methode ListView.getChildAt (i) wird es Kind zurückgeben (es ist Methode der ViewGroup), das war früher vom Adapter nehmen. Adaptor.getView (pos, oldView, parent) gibt eine neue Ansicht (wenn oldView == null) oder oldView mit Daten zurück, die in der Position "Adapter.getItem (pos)" in der Elementliste enthalten sind. Sie möchten Ansichten erhalten, die auch in ListView nach Index gehalten werden? – nfirex

+1

Ich versuche die View zu bekommen, die ich auch mit getChildAt (i) bekomme, aber für Views, die nicht in Sicht sind (wenn ich 8 Items auf dem Bildschirm habe und ich getChildAt (10) anfordere) runter, bekomme ich eine NullPointerException) – Zero

2

können Sie diesen Code

private static void initRecyclerBin(AbsListView view) { 
     try { 
      Field localField = AbsListView.class.getDeclaredField("mRecycler"); 
      localField.setAccessible(true); 
      Object recyclerBin = localField.get(view); 
      Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin"); 
      Field scrapField = clazz.getDeclaredField("mScrapViews"); 
      scrapField.setAccessible(true); 
      ArrayList<View>[] scrapViews; 
      scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin); 
      if (null != scrapViews) { 
       int length = scrapViews.length; 
       for (int i = 0, count = 0; i < length; i++) { 
        if (null != scrapViews[i] && !scrapViews[i].isEmpty()) { 
         for (int j = 0; j < scrapViews[i].size(); j++) { 
          scrapViews[i].get(j);//this is the scrapViews 
         } 
        } 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

und Listview getChildViews() verwenden.

Verwandte Themen