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

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


답변

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에 응답하는 일부 항목 만있는 목록을 만들 수 있습니다.

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


답변

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


답변

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

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

답변

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

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

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


답변

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

답변

이 작동합니다

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

위의 코드 출력은 다음과 같습니다.


답변

나는이 답변의 대부분을 시도했고 자동 링크가 활성화되었지만 동일한 위치에서 긴 프레스를 사용해야하는 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();
    }
}