Frage

Ich muss die Pixelposition eines Elements in einer Liste herausfinden, die mit a angezeigt wurde ListView. Es scheint, als sollte ich einen der von bekommen TextView's und dann verwenden getTop(), aber ich kann nicht herausfinden, wie ich eine Kinderansicht von a bekommen kann ListView.

Aktualisieren: Die Kinder der ViewGroup Korrespondieren 1-zu-1 nicht mit den Elementen in der Liste für a ListView. Stattdessen die ViewGroupDie Kinder entsprechen nur den Ansichten, die derzeit sichtbar sind. So getChildAt() arbeitet auf einem Index, der intern für die ist ViewGroup und hat nicht unbedingt etwas mit der Position in der Liste zu tun, dass die ListView Verwendet.

War es hilfreich?

Lösung

Sehen: Android ListView: Datenindex des sichtbaren Elements abrufenUnd kombinieren Sie sich mit einem Teil von Feet 'Antwort oben, können Ihnen so etwas geben wie:

int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
  Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
  return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);

Der Vorteil ist, dass Sie nicht über die Kinder der Listview -Kinder iteriert werden, was einen Leistungsverlust erzielen könnte.

Andere Tipps

Dieser Code ist einfacher zu verwenden:

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }

Eine schnelle Suche nach den Dokumenten für die ListView -Klasse wurde getChildCount () und getChildat () -Methoden von ViewGroup geerbt. Können Sie diese durch diese mit diesen durch sie iterieren? Ich bin mir nicht sicher, aber es ist einen Versuch wert.

Fand es hier

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
        View v;
        int count = parent.getChildCount();
        v = parent.getChildAt(position);
        parent.requestChildFocus(v, view);
        v.setBackground(res.getDrawable(R.drawable.transparent_button));
        for (int i = 0; i < count; i++) {
            if (i != position) {
                v = parent.getChildAt(i);
                v.setBackground(res.getDrawable(R.drawable.not_clicked));
            }
        }
    }
});

Grundsätzlich erstellen Sie zwei Drawables - Eine, die transparent ist und eine andere die gewünschte Farbe. Fokus auf der angeklickten Position anfordern (int position wie definiert) und ändern Sie die Farbe der besagten Reihe. Dann gehen Sie durch den Elternteil ListView, und ändern Sie alle anderen Zeilen entsprechend. Dies erklärt, wenn ein Benutzer auf die klickt listview mehrmals. Dies geschieht mit einem benutzerdefinierten Layout für jede Zeile in der Zeile ListView. (Erstellen Sie sehr einfach eine neue Layoutdatei mit a TextView - Setzen Sie nicht fokussierbar oder klickbar!).

Kein benutzerdefinierter Adapter erforderlich - Verwendung ArrayAdapter

int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);

Dies setzt voraus, dass Sie die Position des Elements in der ListView kennen:

  View element = listView.getListAdapter().getView(position, null, null);

Dann sollten Sie in der Lage sein, Getleft () und GetTop () aufzurufen, um die Elemente auf der Bildschirmposition zu bestimmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top