cómo implementar un escucha de clics largo en una vista de lista


148

Quiero agregar OnLongClickListeneren mi vista de lista. Siempre que el usuario mantenga presionado el elemento en la lista, se debe realizar alguna acción, pero mi código no capta a este oyente. Por favor, hágame saber a dónde voy mal. El código similar funciona setOnItemClickListenermuy bien.

Aquí está el código:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                // TODO Auto-generated method stub
                 Log.d("in onLongClick");
                 String str=listView.getItemAtPosition(index).toString();

                 Log.d("long click : " +str);
                return true;
            }
}); 

¿Has recordado agregar "implementos OnItemLongClickListener" a tu declaración de clase?
barry

¿Ves en xml si el clic largo está habilitado?
Conectando la vida con Android el

Tal vez tienes un gestor de escucha o algo así que captura la prensa larga y la consume.
Jon Zangitu

Respuestas:


317

Debe establecer setOnItemLongClickListener () en ListView:

lv.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos: " + pos);

                return true;
            }
        }); 

El XML para cada elemento de la lista (si usa un XML personalizado) también debe tenerlo android:longClickable="true"(o puede usar el método de conveniencia lv.setLongClickable(true);). De esta manera, puede tener una lista con solo algunos elementos que responden a un clic largo.

Espero que esto te ayudará.


25
Asegúrese de llamar lv.setLongClickable(true);también.
Chris Lacy

15
Esto no funcionó para mí. Pero esto sí:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit

de alguna manera adroid: longClickable = "true" es el valor predeterminado. Estoy usando API 19. Entonces no necesité especificarlo en absoluto.
user1592714

2
Android establece longClickable = true al configurar el oyente.
Steven Spungin

¿Qué valor se almacena en la identificación larga? en público booleano onItemLongClick (AdapterView <?> arg0, View arg1, int pos, long id
Femn Dharamshi

26

Si su elemento de fila ListView se refiere a un archivo XML separado, asegúrese de agregarlo android:longClickable="true"a ese archivo de diseño además de configurarlo setOnItemLongClickListener()en su ListView.


¡Gracias! Estaba golpeando mi cabeza con este.
Shaihi

15

o prueba este código:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {

    Toast.makeText(list.this,myList.getItemAtPosition(index).toString(), Toast.LENGTH_LONG).show();
                return false;
            }
}); 

6

Creo que este código anterior funcionará en LongClicking en la vista de lista, no en los elementos individuales.

¿por qué no usar registerForContextMenu(listView). y luego obtener la devolución de llamada en OnCreateContextMenu.

Para la mayoría de los casos de uso, esto funcionará igual.


2

En xml agregar

<ListView android:longClickable="true">

En archivo java

lv.setLongClickable(true) 

prueba este setOnItemLongClickListener ()

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int pos, long l) {
                //final String category = "Position at : "+pos;
                final String category = ((TextView) view.findViewById(R.id.textView)).getText().toString();
                Toast.makeText(getActivity(),""+category,Toast.LENGTH_LONG).show();
                args = new Bundle();
                args.putString("category", category);
                return false;
            }
        });

1

Esto debería funcionar

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                           int pos, long id) {
                // TODO Auto-generated method stub

                Toast.makeText(getContext(), "long clicked, "+"pos: " + pos, Toast.LENGTH_LONG).show();

                return true;
            }
        });

tampoco se olvide en su xml android:longClickable="true"o si tiene una vista personalizada agregue esto a su clase de vista personalizadayouCustomView.setLongClickable(true);

aquí está la salida del código anterior ingrese la descripción de la imagen aquí


1

Intenté la mayoría de estas respuestas y todas fallaron para TextViews que tenían habilitado el enlace automático, ¡pero también tuvieron que usar la pulsación larga en el mismo lugar!

Hice una clase personalizada que funciona.

public class TextViewLinkLongPressUrl extends TextView {

    private boolean isLongClick = false;

    public TextViewLinkLongPressUrl(Context context) {
        super(context);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public TextViewLinkLongPressUrl(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(text, type);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_UP && isLongClick) {
            isLongClick = false;
            return false;
        }

        if (event.getAction() == MotionEvent.ACTION_UP) {
            isLongClick = false;
        }

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            isLongClick = false;
        }

        return super.onTouchEvent(event);
    }

    @Override
    public boolean performLongClick() {
        isLongClick = true;
        return super.performLongClick();
    }
}

0

Esto funcionó para mí para cardView y funcionará igual para la vista de lista dentro del adaptador calss, dentro de la onBindViewHolder()función

holder.cardView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                return false;
            }
        });

0

Si desea hacerlo en el adaptador, simplemente puede hacer esto:

itemView.setOnLongClickListener(new View.OnLongClickListener()
        {
            @Override
            public boolean onLongClick(View v) {
                Toast.makeText(mContext, "Long pressed on item", Toast.LENGTH_SHORT).show();
            }
        });

0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

Definitivamente hace el truco.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.