ProgramingTip

imagebutton으로 listview 행을 클릭 할 수 없습니다.

bestdevel 2020. 12. 26. 15:59
반응형

imagebutton으로 listview 행을 클릭 할 수 없습니다.


listview에 문제가 있습니다. 항목 (행)에는 이미지 버튼이 있습니다. imagebutton에는 "android : onClick"이 있으므로 onclick 이벤트는 작동하지만 행 클릭은 작동하지 않습니다. 행 항목에서 이미지 버튼을 제거하면 행 작동을 클릭하십시오 (listview에는 올바른 onclick listner가 있음). 어떻게 고칠 수 있습니까? 사용자가 이미지 버튼을 클릭하고 표준 클릭 이벤트를 클릭 할 때 onclick 이벤트가 필요합니다. 사용자가 행을 선택할 때 (이미지 버튼을 클릭하지 않고 행을 클릭합니다)

내 목록보기 :

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/restaurants_list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@color/list_devider"
        android:dividerHeight="1dp"
        android:cacheColorHint="@color/list_background" /> 

운수 나쁘게,

android:focusable="false"
android:focusableInTouchMode="false"

에서 작동하지 않습니다 ImageButton.

마침내 여기 에서 해결책을 찾았습니다 . 해당 항목에 대한 레이아웃 xml에서

android:descendantFocusability="blocksDescendants" 

루트 뷰로.

s ListView있는 경우에 완벽하게 작동합니다 ImageButton. 기준 공식 , blocksDescendants(가) 의미 포커스를 수신하는 소리 ViewGroup를 차단한다.


listView에 사용자 지정 어댑터를 사용할 수 있습니다 (아직 사용하지 않는 경우). 그리고 getView(int position, View inView, ViewGroup parent)어댑터 방법에서 다음과 같이하십시오.

@Override
public View getView(int position, View inView, ViewGroup parent) {

    View v = inView;
    ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview

    if (v == null) {
        LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inflater.inflate(R.layout.list_item, null);
        viewHolder = new ViewHolder();
        viewHolder.image = (ImageView) v.findViewById(R.id.ImageView);
        v.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) v.getTag();
    }

        .....

    viewHolder.image.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on imageView
        }i
    });

    v.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            //Click on listView row
        }
    });

        .....

    return (v);
}

사용자 지정 어댑터를 만드는 데 도움이 필요한 경우 여기를 참조 하십시오 .


리스트 뷰의 행에 Button, Image.. 등 .. 와 같은 클릭 가능한 요소가 있으면 onItemClick작동하지 않습니다. 따라서 getView목록 어댑터 에 클릭 리스너를 작성해야합니다 .

자세한 내용은 출시 제품 .


버튼에 대해 다음 속성을 설정합니다.

      android:focusable="false"
      android:focusableInTouchMode="false"

또는 어댑터 클래스에서 동적으로 접근 할 수 있습니다.

        yourButton.setFocusable(false);
    yourButton.setFocusableInTouchMode(false);

그리고 listview에 대해 선택 모드를 단일로 설정했는지 확인하십시오.

       listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

제 경우에는 android:descendantFocusability="blocksDescendants"메인 레이어의 경우 ListView에서도 작동하지 않았습니다. 나는 또한 android:focusable="false" android:focusableInTouchMode="false"그것이 Buttons에서 작동한다고 들었지만 ImageButton을 가지고 있었기 때문에 그것을 시도했습니다.

그러나 레이아웃의 CS 파일에서 버튼의 속성을 설정하면 작동했습니다.

var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1);
imageButton.Focusable = false;
imageButton.FocusableInTouchMode = false;
imageButton.Clickable = true;

행에 클릭 가능한 여러 요소가있는 경우 onItemClick ()이 작동하지 않습니다. 방법 OnClickListener에서 를 설정해야합니다 getView(). 리스너를 재활용 할 수 있도록 View의 태그를 저장하고 리스너에 메서드를 추가하여 다른 행에 특화 될 수 있도록합니다.

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        View view = super.getView(position, convertView, parent);

        RowClickListeners listeners = (RowClickListeners) view.getTag();
        if (listeners == null) {
            listeners = new RowClickListeners();
        }

        // Row click listener:
        RowClickListener onClickListener = listeners.rowClickListener;
        if (onClickListener == null) {
            onClickListener = new RowClickListener();
            listeners.rowClickListener = onClickListener;
        }
                    onClickListener.setToPosition(pos);
        view.setOnClickListener(onClickListener);

        // Overflow listener:
        View btn = view.findViewById(R.id.ic_row_btn);
        ButtonListener btnListener = listeners.buttonClickListener;
        if (rowListener == null) {
            btnListener = new ButtonListener(activity);
            listeners.rowClickListener = btnListener;
        }
                    btnListener.setToPosition(pos);
        btnListener.setCollection(collectionId);
        btn.setOnClickListener(btnListener);
    }


    public static class RowClickListeners {
        public RowClickListener rowClickListener;
        public ButtonListener buttonClickListener;
    }

위의 단일 답변은 나에게 효과가 없었지만 조합은 효과적이었습니다.

I가 설정 android:descendantFocusability="blocksDescendants"ListView에와 android:focusable="false" android:focusableInTouchMode="false"는 XML의 ImageButtons에 AND 도 설정 자바 I에서 descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)ListView에와 focusable(false), focusableInTouchMode(false), clickable(true)ImageButtons에.

참조 URL : https://stackoverflow.com/questions/11428303/cant-click-on-listview-row-with-imagebutton

반응형