como implementar um ouvinte de clique longo em uma exibição de lista

148

Quero adicionar OnLongClickListenerna minha exibição de lista. Sempre que o usuário pressiona o item na lista, alguma ação deve ser executada, mas meu código não captura esse ouvinte. Por favor, deixe-me saber onde estou errado. O código semelhante funciona setOnItemClickListenermuito bem.

Aqui está o 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
fonte
Você se lembrou de adicionar "implementa OnItemLongClickListener" à sua declaração de classe?
Barry
veja no xml se o clique longo está ativado?
Conectando a vida ao Android
Talvez você tenha um listener de gestos ou algo parecido que captura a imprensa longa e a consome.
precisa saber é o seguinte

Respostas:

317

Você precisa definir setOnItemLongClickListener () no 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;
            }
        }); 

O XML para cada item da lista (você deve usar um XML personalizado) também deve ter android:longClickable="true"(ou você pode usar o método de conveniência lv.setLongClickable(true);). Dessa forma, você pode ter uma lista com apenas alguns itens que respondem ao clique longo.

Espero que isso ajude você.

Dinesh Sharma
fonte
25
Certifique-se de ligar lv.setLongClickable(true);também.
precisa saber é o seguinte
15
Isso não funcionou para mim. Mas isto:lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
Luis A. Florit
de alguma forma adroid: longClickable = "true" é o padrão. Estou usando a API 19. Portanto, não precisei especificar nada.
user1592714
2
O Android define longClickable = true ao definir o ouvinte.
Steven Spungin 7/08
qual valor é armazenado no ID longo? em onItemLongClick public boolean (AdapterView arg0, Vista arg1, pos int, long id <?>
FeMn Dharamshi
26

Se o item de linha do ListView se referir a um arquivo XML separado, adicione-o android:longClickable="true"ao arquivo de layout, além de definir setOnItemLongClickListener()o ListView.

Jonathan Lin
fonte
Obrigado! Estava batendo minha cabeça com este.
Shaihi
15

ou tente 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
fonte
6

Eu acho que esse código acima funcionará em LongClicking na lista, não nos itens individuais.

por que não usar registerForContextMenu(listView). e, em seguida, obtenha o retorno de chamada no OnCreateContextMenu.

Para a maioria dos casos de uso, isso funcionará da mesma forma.

nandeesh
fonte
2

No xml add

<ListView android:longClickable="true">

No arquivo java

lv.setLongClickable(true) 

tente isso 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
fonte
1

isso deve 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;
            }
        });

também não se esqueça de usar seu xml android:longClickable="true"ou, se você tiver uma visualização personalizada, adicione-a à sua classe de visualização personalizadayouCustomView.setLongClickable(true);

aqui está a saída do código acima insira a descrição da imagem aqui

Ayoub
fonte
1

Tentei a maioria dessas respostas e todas estavam com falha nos TextViews que tinham o link automático ativado, mas também tiveram que usar pressão longa no mesmo lugar!

Eu fiz uma classe 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
fonte
0

Isso funcionou para mim no cardView e funcionará da mesma maneira para o listview dentro do adaptador calss, dentro da onBindViewHolder()função

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

Se você quiser fazer isso no adaptador, basta fazer o seguinte:

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

Definitivamente faz o truque.

Kalaiyo5
fonte