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;
            }
}); 
techayu
fuente
¿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á.

Dinesh Sharma
fuente
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.

Jonathan Lin
fuente
¡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;
            }
}); 
Ardi
fuente
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.

nandeesh
fuente
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;
            }
        });
Vijay Sharma
fuente
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í

Ayoub
fuente
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();
    }
}
Oliver Dixon
fuente
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;
            }
        });
niks
fuente
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();
            }
        });
usuario846316
fuente
0
    listView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        return false;
    }
});

Definitivamente hace el truco.

Kalaiyo5
fuente