목록보기에서 긴 클릭 리스너를 구현하는 방법


148

OnLongClickListener내 목록보기에 추가 하고 싶습니다. 사용자가 목록에서 항목을 길게 누를 때마다 몇 가지 작업을 수행해야하지만 코드 에서이 리스너를 잡지 않습니다. 내가 잘못 가고있는 곳을 알려주십시오. 비슷한 코드가 setOnItemClickListener잘 작동 합니다.

코드는 다음과 같습니다.

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

클래스 선언에 "구현 OnItemLongClickListener"를 추가 한 것을 기억하십니까?
barry

긴 클릭의 활성화 여부는 XML을 참조하십시오?
안드로이드와 생활 연결

어쩌면 제스처 리스너 또는 길게 누르는 것을 포착하고 소비하는 것과 같은 것이있을 수 있습니다.
Jon Zangitu

답변:


317

ListView에서 setOnItemLongClickListener () 를 설정해야합니다 .

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

목록의 각 항목에 대한 XML (사용자 지정 XML을 사용해야 함)도 있어야합니다 android:longClickable="true"(또는 편리한 방법을 사용할 수 있음 lv.setLongClickable(true);). 이렇게하면 longclick에 응답하는 일부 항목 만있는 목록을 만들 수 있습니다.

이것이 도움이되기를 바랍니다.


25
전화해야합니다 lv.setLongClickable(true);.
Chris Lacy

15
이것은 나를 위해 작동하지 않았습니다. 그러나이 작업을 수행합니다lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {...
루이스 A. Florit에게

어떻게 든 adroid : longClickable = "true"가 기본값입니다. API 19를 사용하고 있습니다. 따로 지정할 필요가 없습니다.
user1592714

2
리스너를 설정할 때 Android는 longClickable = true로 설정합니다.
Steven Spungin

long id에 어떤 값이 저장됩니까? 공개 부울에서 onItemLongClick (AdapterView <?> arg0, View arg1, int pos, long id
Femn Dharamshi

26

ListView 항목이 별도의 XML 파일을 참조하는 경우 ListView android:longClickable="true"설정 외에 해당 레이아웃 파일에 추가해야합니다 setOnItemLongClickListener().


감사! 이것으로 내 머리를 두드리고 있었다.
Shaihi

15

또는이 코드를 사용해보십시오 :

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

위의 코드는 개별 항목이 아닌 목록보기를 LongClicking에서 작동한다고 생각합니다.

왜 사용하지 마십시오 registerForContextMenu(listView). 그런 다음 OnCreateContextMenu에서 콜백을 가져옵니다.

대부분의 사용 사례에서 이것은 동일하게 작동합니다.


2

XML에서 추가

<ListView android:longClickable="true">

자바 파일에서

lv.setLongClickable(true) 

이 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

이 작동합니다

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

또한 XML에서 잊지 말고 android:longClickable="true"사용자 정의보기가있는 경우 사용자 정의보기 클래스에 추가하십시오.youCustomView.setLongClickable(true);

위의 코드 출력은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오


1

나는이 답변의 대부분을 시도했고 자동 링크가 활성화되었지만 동일한 위치에서 긴 프레스를 사용해야하는 TextViews에서 모두 실패했습니다!

작동하는 사용자 정의 클래스를 만들었습니다.

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

이것은 cardView에서 저에게 효과적이며 onBindViewHolder()기능 내에서 어댑터 calss 내부의 listview에서도 동일하게 작동합니다

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

0

어댑터에서 수행하려면 다음과 같이하십시오.

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

트릭을 확실히합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.