Me estoy enfrentando algunos más difícil) cuando trato de usar el performItemClick función de la ListView.

Todo lo que quiero hacer es realizar un clic a través de programación en el primer elemento de la lista.

¿Cómo puedo hacer eso? Miré hasta que la función en la documentación, pero realmente no entendía sus parámetros.

He intentado algo como:

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

Pero no funcionó (myListView.getChildAt(0) returns null)

Gracias de antemano!

  • se solucionar este problema ?Si sí, por favor, el escribir la respuesta.Porque yo estoy atascado con el mismo problema.Gracias de antemano.
InformationsquelleAutor | 2011-11-11

22 Comentarios

  1. 64
    mList.performItemClick(
            mList.getAdapter().getView(mActivePosition, null, null),
            mActivePosition,
            mList.getAdapter().getItemId(mActivePosition));

    Donde mActivePosition se haga clic en su posición!
    Todo lo mejor! 🙂

    • Tengo mejores resultados cuando se utiliza mList.getChildAt(mActivePosition) como primer parámetro.
    • Gracias … Esto es lo que yo estaba buscando …
    • donde quiero poner este código?en setOnItemClickListener?
    • Creo que debe ser mList.getChildAt(mList.getHeaderViewsCount()+mActivePosition)
    • Esto debe ser después de setOnItemClickListener(...)(si alguna).. cosa común, pero lo he conseguido perder.
  2. 26

    Esto funcionó para mí.

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

    usar el adaptador para obtener la vista de la posición del elemento. Los otros 2 parámetros no quería así que me fui de ellos null. Dejando convertView null hace que el adaptador para representar un nuevo punto de vista. Es un problema de rendimiento, pero puesto que esto es sólo ocurre una vez en un tiempo no tendrá mucho efecto. No es necesario especificar el padre para nada, porque no lo estoy usando.

    posición es el lugar donde el elemento se encuentra.
    Además de estas 2 líneas de código antes de su performItemClick crear la ilusión de tener el elemento de la lista seleccionado. También se aseguran de que el elemento correspondiente en la pantalla.

    listView.requestFocusFromTouch();
    listView.setSelection(position);
    • No debería el último argumento en performItemClick ser listView.getAdapter().getItemId(posición)?
    • Como se responde a continuación, funciona incluso al pasar null como la vista.
  3. 14

    Esto funciona mejor para mí. Ejecutar esto en el hilo principal.

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

    Esto es similar a Arun José de la respuesta, pero la cola de un mensaje en el hilo principal para dar la ListView algo de tiempo para iniciar.

    • Voy a utilizar tu respuesta en otra respuesta, como observaciones no código de formato :/. Gracias por el controlador
    • No sé por qué, pero después del cambio de la orientación de este método no funciona
    • Una posible causa: su ListView ha sido re-creado y que necesita para obtener una nueva referencia para que después cambio de orientación: mList = getView().findViewById(R.id.list);
    • su woring para mí.. yo uso BaseAdapter.. Thankx
    • Esto no siempre funciona, ya que ViewGroup#getChildAt(int index) sólo funcionará en la actualidad, los elementos visibles en la pantalla, utilice getView(posición, null, null) lugar!
  4. 6

    He probado el código de abajo y funcionó.

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

    El primer parámetro (ver) puede ser null.

    • mientras @Arun Jose ‘s código de trabajo fino, estableciendo el primer parámetro es null, como aquí se propone, se bloquea la aplicación
    • Buena pregunta. Para mí está funcionando correctamente. Por favor, compruebe el LogCat. Tal vez usted va a encontrar la razón.
    • Esto funciona para mí también. También me pareció que el id parece ser ignorado.
  5. 2
    mList.performItemClick(
        mList.getChildAt(mActivePosition),
        mActivePosition,
        mList.getAdapter().getItemId(mActivePosition));

    donde mActivePosition es la posición del niño en la Vista de Lista.

  6. 1

    Utilizando el código de @sulal propuesto, puede colocarla en onLoadFinished, si utiliza un LoaderManager. Por ejemplo algo como

    @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 puede ser 0 (es decir, la posición en el primer elemento) o una posición se mantuvo durante eg onPause

  7. 1

    A en primer lugar he intentado utilizar este código en mi Fragmento(Maestro/Detalle -> NameListFragment)

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

    Pero no funcionó. Cuando hice @Override onStart() método en el fragmento y me mudé mi código para onStart(). Después de que funciona correctamente para mí.

  8. 1

    yo estaba trabajando con performItemClick y a mí me funcionó, pero con un pequeño problema.
    traté de color el fondo de la presión elemento, pero nunca funcionó,
    acaba de darse cuenta de que si pasa convertir a ver como null (el segundo parámetro) y, a continuación, tratando de hacer algo en OnClick() no se efect porque el getView() método del Adaptador de darle una Vista diferente del Objeto.
    necesita manipular el getView() método de su adaptador para la captura de la Vista para qork en él.

  9. 1

    Si usted está trabajando en una unidad de caso de prueba.
    Intente utilizar getInstrumentation().waitForIdleSync(), para esperar la lista de ser cargado, y extender la ActivityInstrumentationTestCase2
    Ver este respuesta.

  10. 1

    Acabo de encontrar este monstruo del problema hoy en día , y yo que me pruebe la mejor manera de tratar con él.
    Mi condición es , cuando yo recién inicio el diseño , necesito hacer algún elemento marcado.
    Pero cuando yo uso el gridView.getChildAt(posición) , siempre se devuelve null. Conocí a este problema antes , causada por No terminar de dibujar el diseño . Así que me envíe un mensaje . controlador.postDelayed( .. , ..) , funciona. Gracias que el movimiento de esta Excepción.

  11. 1

    esto puede ser viejo, pero esto puede ayudar a :

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

    NOTA : el primer parámetro es null y todavía funciona, si tiene un adaptador personalizado, convertView será llenado con diseño personalizado y ver y tal.

    -saludos /feliz codificaciones.

  12. 1

    Este trabajo para mí
    Si desea obtener extraño resultado cuando se utiliza getView, esto es debido a que el elemento de la lista que desea no existen en las partes visibles. Utilice a continuación:

    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;
        }

    Y, a continuación,

    listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);
  13. 1

    Cuando se utiliza Listview (matriz simple adaptador o adaptador personalizado) definir listview y otros, finalmente, hacer que realizar clic.

    Por ejemplo:

     //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));

    Nota: Después de crear el setOnItemClickListener sólo debe llamar a
    realizar clic. De lo contrario, no correctamente.

  14. 1

    Probar este:

    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;
        }
  15. 0

    La performClick es, probablemente, llamado antes de listview se llenó, poner a punto de interrupción en getView y en performItemClick y comprobar que se llama primera

    • Es de ser llenados. Al menos no es null. He intentado poner ese trozo de código, incluso después de la adpter se ha establecido, pero aún no funciona. Esto me está volviendo loco! Alguna idea?
  16. 0

    Soltando Algo De Experiencia.

    utilizando listview1.performItemClick, también activará su listview1.OnItemClickListener si usted está utilizando el oyente, con la misma listview en el código.

    Hope It helps  
  17. 0

    Si desea obtener extraño resultado cuando se utiliza getView, esto es debido a que el elemento de la lista que desea no existen en las partes visibles. Utilice a continuación:

    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;
        }

    Y, a continuación,

    listView.performItemClick(getViewFromAdapterByPosition(index, listView), index, 0);
    • Este es un suplemento respuesta a @Arun Jose ‘s respuesta
  18. -4

    Esto es desde el Comienzo de los Juegos para Android. Crea una lista simple de los elementos de los que puede hacer clic para abrir una nueva actividad. Cada elemento de la lista, por supuesto, tendría que ser también añadido a la AndroidManifest.xml como una actividad separada con una .ListItem# nombre.

    public class MainActivity extends ListActivity {
    String tests[] = { "ListItem1",
                       "ListItem2",
                       "ListItem3",
                       "ListItem4"};
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tests));
    }
    
    @Override
    protected void onListItemClick(ListView list, View view, int position, long id) {
        super.onListItemClick(list, view, position, id);
        String testName = tests[position];
    
        try {
            Class<?> classInstance = Class.forName("your.package.name." + testName);
            Intent intent = new Intent(this, classInstance);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    }

    • Gracias por responder, pero esto no es lo que quiero. Quiero realizar un clic a través de programación en mi ListView usando el método performItemClick.
    • Por favor eliminar esta respuesta es incorrecta! Gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here