it-swarm.com.de

Android - ListView - performItemClick

Ich habe einige Schwierigkeiten, wenn ich versuche, die performItemClick - Funktion der ListView zu verwenden.

Alles, was ich tun möchte, ist, einen programmgesteuerten Klick auf den ersten Punkt der Liste auszuführen.

Wie kann ich das machen? Ich habe diese Funktion in der Dokumentation nachgeschlagen, aber ihre Parameter nicht wirklich verstanden.

Ich habe so etwas ausprobiert:

 myListView.performItemClick(myListView.getChildAt(0), 0, myListView.getChildAt(0).getId());

Aber es hat nicht funktioniert (myListView.getChildAt(0) returns null)

Danke im Voraus!

38
user1022011
mList.performItemClick(
        mList.getAdapter().getView(mActivePosition, null, null),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

Wo mActivePosition Ihre Klickposition ist! Alles Gute! :)

63
Arun Jose

Das hat bei mir funktioniert. 

listView.performItemClick(
    listView.getAdapter().getView(position, null, null), position, position);

verwenden Sie den Adapter, um die Position des Elements anzuzeigen. Die anderen 2 Parameter, die ich nicht wollte, haben sie null gelassen. Wenn Sie convertView null belassen, wird vom Adapter eine neue Ansicht gerendert. Es ist ein Leistungsproblem, aber da dies nur gelegentlich geschieht, hat es keine großen Auswirkungen. Ich muss den Elternteil für nichts angeben, da ich ihn nicht benutze.

position ist nur die Stelle, an der sich Ihr Artikel befindet .. Außerdem erzeugen diese 2 Codezeilen vor Ihrem performItemClick die Illusion, dass das Listenelement ausgewählt wird. Sie stellen außerdem sicher, dass das entsprechende Element auf dem Bildschirm angezeigt wird.

listView.requestFocusFromTouch();
listView.setSelection(position);
26
Steven

Das funktioniert am besten für mich. Führen Sie dies im Hauptthread aus.

new Handler().post(new Runnable() {
    @Override
    public void run() {
        mList.performItemClick(
                mList.getChildAt(mActivePosition),
                mActivePosition,
                mList.getAdapter().getItemId(mActivePosition));
    }
});

Dies ist der Antwort von Arun Jose ähnlich, aber es wird eine Nachricht an den Haupt-Thread in die Warteschlange gestellt, damit die Variable ListView etwas Zeit zum Einleiten hat.

14
sulai

Ich habe den folgenden Code ausprobiert und es hat funktioniert.

getListView().performItemClick(null, 0, getListAdapter().getItemId(0));

Der erste Parameter (view) kann null sein.

6
Blehi

Ich ging mit

listView.getAdapter().getView(position, null, null).performClick();
5
koljaTM
mList.performItemClick(
    mList.getChildAt(mActivePosition),
    mActivePosition,
    mList.getAdapter().getItemId(mActivePosition));

dabei ist mActivePosition die Position der untergeordneten Ansicht in der Listenansicht.

2
nick9999

Wenn Sie an einem Unit-Testfall arbeiten. Versuchen Sie, mit getInstrumentation (). WaitForIdleSync () zu warten, bis die Liste geladen ist, und erweitern Sie ActivityInstrumentationTestCase2. Siehe diese Antwort .

1
dinhokz

Probier diese:

public static boolean performClicKOnLisViewFromIndex(ListView listView, int index){
        if(listView != null){
            if(listView.getAdapter()!= null && listView.getAdapter().getCount() >0 && listView.getAdapter().getCount() > index ){
                listView.performItemClick(
                        listView.getAdapter().getView(index, null, null),
                        index, listView.getItemIdAtPosition(index));
                return true;
            }
        }
        return  false;
    }
1
Maxime Claude

Zunächst habe ich versucht, diesen Code in meinem Fragment zu verwenden (Master/Detail -> NameListFragment)

getListView().performItemClick(null, 0, getListView().getAdapter().getItemId(0));

Aber es hat nicht funktioniert. Wenn ich die @Override onStart()-Methode in fragmentiert habe und meinen Code nach onStart() verschoben habe. Danach funktioniert es richtig für mich.

1
Khwarezm Shah

Mit dem vorgeschlagenen Code @sulal können Sie ihn in onLoadFinished platzieren, wenn Sie einen LoaderManager verwenden. ZB so etwas

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    //....
    // mSelectedId keeps the currently selected id
    // INVID is an invalid value
    if (mSelectedId == INVID) { // nothing selected
        // sulal's code
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                mList.performItemClick(
                        mList.getChildAt(mActivePosition),
                        mActivePosition,
                        mList.getAdapter().getItemId(mActivePosition));
                mSelectedId = mList.getAdapter().getItemId(mActivePosition);
            }
        });            
    }

mActivePosition kann 0 sein (dh Position auf dem ersten Artikel) oder eine Position, die zB während einer Pause gehalten wird

1
denispyr

Wenn Sie Listview verwenden (einfacher Array-Adapter oder benutzerdefinierter Adapter), definieren Sie Listview und führen Sie zum Abschluss einen Klick aus.

Zum Beispiel:

 //At onCreate function:

lv = (ListView) findViewById(R.id.listView);
        lv.setAdapter(new CustomAdapter(List_item.this, list, images));


lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)    {
// on click function works
    }
}


int position = 0;
lv.performItemClick(lv.getAdapter().getView(position, null, null), position, lv.getAdapter().getItemId(position));

Hinweis: Nachdem Sie den setOnItemClickListener erstellt haben, sollten Sie Click aufrufen. Andernfalls wird es nicht korrekt ausgeführt.

1
User Learning

Ich habe gerade dieses Freak-Problem heute und versuche mich am besten damit umzugehen. Meine Bedingung ist, wenn ich das Layout zum ersten Mal initiiere, muss ich ein Element prüfen, das überprüft wird . Wenn ich jedoch gridView.getChildAt (position) verwende, gebe immer null zurück. Ich habe dieses Problem schon einmal getroffen, weil das Zeichnungslayout nicht beendet wurde. Also sende ich eine Postnachricht. handler.postDelayed (.., ..), es funktioniert. Vielen Dank, wer diese Ausnahme beantragt.

1
innershows

das kann alt sein, aber das kann helfen: 

lvList.performItemClick(null, index, lvList.getItemIdAtPosition(index) ); 

HINWEIS: Der erste Parameter ist null und funktioniert weiterhin. Wenn Sie über einen benutzerdefinierten Adapter verfügen, wird convertView mit benutzerdefiniertem Layout und Ansicht gefüllt. 

-cheers/glückliche codierungen.

1
ralphgabb

Dies funktioniert für mich Wenn Sie bei der Verwendung von getView ein seltsames Ergebnis erhalten, liegt dies daran, dass das gewünschte Listenelement nicht in sichtbaren Teilen vorhanden ist. Verwenden Sie unten:

private View getViewFromAdapterByPosition(int position, ListView listView) 
{
        View view;
        int firstVisiblePos = listView.getFirstVisiblePosition();
        int lastVisiblePos = listView.getLastVisiblePosition();

        if (position < firstVisiblePos || position > lastVisiblePos) {
            view = listView.getAdapter().getView(position, null, listView);
        } else {
            view = listView.getChildAt(position - firstVisiblePos);
        }
        return view;
    }

Und dann,

listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);
1
sandeep negi

ich arbeitete mit performItemClick und es funktionierte für mich, aber mit einem kleinen Problem. Ich versuchte den Hintergrund des gepressten Elements zu färben, aber es hat nie funktioniert Wenn Sie versuchen, etwas auf OnClick () zu tun, wird dies nicht wirksam, da die getView () - Methode des Adapters ein anderes Ansichtsobjekt ..__ Sehen Sie, damit Sie darauf qorken können.

1
Gal Rom

Der performClick wird wahrscheinlich vor dem Auflisten von listview aufgerufen. Setzen Sie den Haltepunkt in getView und auf performItemClick und prüfen Sie, welcher zuerst aufgerufen wird

0
user1034443

Wenn Sie mit getView ein ungewöhnliches Ergebnis erhalten, liegt dies daran, dass das gewünschte Listenelement nicht in sichtbaren Teilen vorhanden ist. Verwenden Sie unten:

private View getViewFromAdapterByPosition(int position, ListView listView) 
{
        View view;
        int firstVisiblePos = listView.getFirstVisiblePosition();
        int lastVisiblePos = listView.getLastVisiblePosition();

        if (position < firstVisiblePos || position > lastVisiblePos) {
            view = listView.getAdapter().getView(position, null, listView);
        } else {
            view = listView.getChildAt(position - firstVisiblePos);
        }
        return view;
    }

Und dann,

listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);
0
phi

Einige Erfahrungen fallenlassen

wenn Sie listview1.performItemClick verwenden, wird auch listview1.OnItemClickListener ausgelöst, wenn Sie den Listener mit derselben Listenansicht in Ihrem Code verwenden.

Hope It helps  
0
HourGlass

Das hat für mich funktioniert:

listView.getAdapter().getView(1, null, null).performClick();
0
Drilon Kastrati

getListView().performItemClick(null, 0, 0) hat den Trick für mich gemacht (für Position 0).

0

Das funktioniert für mich:

listview.getSelectedView().performClick();
0
hamidjahandideh