버튼을 추가하여 ListView setOnItemClickListener가 작동하지 않음


91

각 행에 텍스트와 버튼이있는 목록보기가 있는데 목록보기 setOnItemClickListener ()가 작동하지 않습니다. 항목 클릭과 버튼 클릭 이벤트를 다르게 처리 할 수 ​​있습니까 (항목 클릭은 ActivityA를 호출해야하고 버튼 클릭은 ActivityB를 호출해야 함). 누구든지 해결책이 있습니까

    private ArrayList<String> userIDArr = null;
    private ArrayList<String> userNameArr = null;
    private DatabaseHelper dbHelper = null;
    private ListView userListView=null; 


    public void onCreate(Bundle savedInstanceState) 
        {
          super.onCreate(savedInstanceState);         
          setContentView(R.layout.list_view);         
          dbHelper = new DatabaseHelper(this.getApplicationContext());        
          Map<String,ArrayList<String>> displayMap = dbHelper.getUserListToDisplay();
          userIDArr = displayMap.get("UserID");
          userNameArr = displayMap.get("FirstName1");           


          userListView = (ListView) findViewById(R.id.listView2);
          userListView.setAdapter(new UserListAdapter(this,userIDArr));


          userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {

                  Toast.makeText(usersListActivity.this,
                            "Item in position " + position + " clicked", Toast.LENGTH_LONG).show();
              }
            });
     }


    public class UserListAdapter extends ArrayAdapter<String>
    {
        Activity context;
        public UserListAdapter(Activity context, ArrayList<String> names) {
            super(context, R.layout.list_item, names);
            this.context = context;
        }
        private class ViewHolder {
            public TextView UserNameAndID;
            public TextView Description;
            public Button  UploadBtn;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            View rowView = convertView;
            if (rowView == null) {
                LayoutInflater inflater = context.getLayoutInflater();
                rowView = inflater.inflate(R.layout.list_item, null, true);
                holder = new ViewHolder();
                holder.UserNameAndID = (TextView) rowView.findViewById(R.id.User_detailsTxt);
                holder.Description = (TextView) rowView.findViewById(R.id.User_status);
                holder.UploadBtn = (Button) rowView.findViewById(R.id.uploadbutton);
                holder.UploadBtn.setOnClickListener(new View.OnClickListener() {  

                        public void onClick(View v) {  
                        Toast.makeText(usersListActivity.this," Button clicked",Toast.LENGTH_SHORT).show();
                        }   
                    }); 
                    rowView.setTag(holder);
            } else {
                holder = (ViewHolder) rowView.getTag();
            }
            String s = userNameArr.get(position)+","+userIDArr.get(position);
            holder.UserNameAndID.setText(s);
            holder.Description.setText("U r in middle");
            return rowView;
        }
    }
}`

답변:


261

다음과 같이 버튼 (또는 목록 항목 내부 클릭을 처리하려는 다른보기)을 설정해보십시오.

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

@Ben Lee : 체크 박스에 추가했습니다! 그래도 작동이 안되는. 내가 뭘 잘못하고 있니?
TDaver

1
android:focusableInTouchMode="false"내 문제를 해결합니다. 사용자 지정 LinearLayout 행에 두 개의 TextView를 사용합니다. Yuk android ...
Youngjae

12
ImageButton이 작동하지 않습니다. 목록 항목보기에 ImageButton이 포함 된 경우 android : descendantFocusability = "blocksDescendants"를 설정합니다.
ChangUZ

8
android : clickable = "false"추가가 필요할 수도 있습니다 (XML에 명시 적으로 추가하려면 레이아웃 디자이너에서 켜고 끌 수 있음)
jrg

11
경고 : ImageButton을 사용하는 경우 setFocusable (false)을 사용해야하므로 ImageButton의 생성자가 xml 파일에서 확장 된 후이 속성을 활성화합니다. 그러나 좋은 대답
Mateu

119

때때로 목록은 여전히 ​​클릭 리스너가 통과하도록 만들 수 없습니다. 이 경우 속성을 하나 더 추가해야 할 수 있습니다.

android:descendantFocusability="blocksDescendants" 

그리고이 속성은 ListView 요소를 제공 한 XML의 최상위 레이아웃에 추가되어야합니다.


아무도 내가 방금 한 일을하지 않습니다. EditText와 같이 행에 초점이 필요한 것이 있으면 바람직하지 않습니다. 나는 지금 바보 같다.
Kitalda

제 경우에는이 조언이 도움이되었습니다. TextView와 RadioButton이 있는데 첫 번째는 클릭하지 않았고 두 번째는 TextView를 선택하지 않았습니다. RadioButton에 "android : clickable ="false ""를 썼습니다.
CoolMind

버튼이하여 ImageButton 때이 솔루션입니다
Mahonster

15

목록보기에 활성보기 / 포커스 가능보기가있는 경우 비활성화 됩니다. 일반적으로 onItemClickListener초점을 맞출 android:focusable="false"수있는보기에 다음 을 추가하여 초점을 맞출 수 없게 만들 수 있습니다 .


8

타자 물 Listener은 전체 rowViewButton내부 에 모두 추가하는 것입니다 Adapter. 이 같은.

public class MyAdapter extends BaseAdapter implements View.OnClickListener{

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
            View rowView = convertView;
            if(rowView == null)
            {
                    //intialize rowView, and set onclick listener only once.
                    rowView = someIntilizationMehhodOrInflatorMethod();
                    //add listener to the button also and also to the row view
                    rowView.setOnClickListener(this);
            }
            //all your inflation and setting values goes here and at the end,
            //set position as tag to get the correct position, rather buggy one.
            rowView.setTag(String.valueOf(position));


            return rowView;
    }
    public void onClick(View v)
    {
            //now get the tag of View v and convert it to integer.
            int pos = Integer.parseInt(v.getTag().toString());
            Toast.makeText(context,"Item in position " + pos + " clicked",Toast.LENGTH_LONG).show();
    }
}

3
원격으로 더 나은 방법은 무엇입니까? 모든 데이터 요소에 대해 하나의 리스너에 대해 onClickListener를 만들고 있습니다. 당신은 예를 들어 어떤 뷰를 재활용하지도 않습니다.
JRomero 2013 년

@ J.Romero는 코드 최적화의 여지가 많지만 이것은 단지 예일뿐입니다. 그러나 방금 코드를 업데이트했습니다.
아딜 Soomro

5

설정보십시오 setClickable(false)Button, ImageButton등과 View같이 :

view.setClickable(false);
button.setClickable(false);
imagebutton.setClickable(false);

또한 추가해야

android:descendantFocusability="blocksDescendants"

메인 (첫 번째 레벨) 레이아웃으로


2
내가 설정 blocksDescendants이 충분하다 발견했습니다, 필요 취소 없습니다 포커스 등 안드로이드 4.1
djdance

2

버튼을 추가하는 대신 잘 작동 ImageView하는 setOnItemClcik리스너를 제공하십시오 .

public View getView(final int position, View convertView, ViewGroup parent) {
     MyViewHolder mViewHolder;
     if(convertView == null) {
         convertView = inflater.inflate(R.layout.youtubesearchrow, null);
         mViewHolder = new MyViewHolder();
         mViewHolder.alarm = (ImageView)convertView.findViewById(R.id.alarm);
         convertView.setTag(mViewHolder);
     } else {
         mViewHolder = (MyViewHolder) convertView.getTag();
     }

     mViewHolder.tvTitle = detail(convertView, R.id.tvTitle,    
     // mViewHolder.tvDesc  = detail(convertView, R.id.tvDesc,  
     mViewHolder.ivIcon  = detail_image(convertView, R.id.ivIcon,  

     mViewHolder.alarm.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        // TODO Auto-generated method stub
        }
    });

        return convertView;
}

1

나는 또한 같은 오류가 발생합니다. 목록에서 레이아웃 경우에 당신은 그것을 대체 할 수있는 버튼이 TextViewImageButton와를 ImageView. 참고로 내 코드는 다음과 같습니다.

private Activity activity;
private LayoutInflater inflater;

private List<ItemList> itemListsItems;

private Bookmark_SharedPref pref;

ImageLoader imageLoader = AppController.getInstance().getImageLoader();

public CustomListAdapter_Item(Activity activity,List<ItemList> itemListsItems){
    this.activity=activity;
    this.itemListsItems=itemListsItems;
    pref = new Bookmark_SharedPref(activity);
}


@Override
public int getCount() {
    return itemListsItems.size();
}

@Override
public Object getItem(int position) {
    return itemListsItems.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

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

    View v = convertView;
    ViewHolder holder;

    if(inflater == null){
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    if(convertView == null){
        convertView = inflater.inflate(R.layout.item_layout,null);

        holder = new ViewHolder();
        convertView.setTag(holder);
    }
    else{
        holder = (ViewHolder)convertView.getTag();
    }


    if(imageLoader == null){
        imageLoader = AppController.getInstance().getImageLoader();
    }




     holder.img = (NetworkImageView)convertView.findViewById(R.id.item_image);
    holder.Title = (TextView)convertView.findViewById(R.id.item_title);
    holder.Cat = (TextView)convertView.findViewById(R.id.item_category);

    holder.id = (TextView)convertView.findViewById(R.id.itemid);

    holder.Desc = (TextView)convertView.findViewById(R.id.item_description);

    holder.book = (ImageView)convertView.findViewById(R.id.bookmark_star);



    // getting blog data or the row
    ItemList il = itemListsItems.get(position);

    //setting image
    holder.img.setImageUrl(il.getImageUrl(), imageLoader);

    // setting title
    holder.Title.setText(il.getTitle());

    //setting category
    holder.Cat.setText(il.getCategory());


    //setting blog id
    holder.id.setText(il.getId());

    //setting description
    holder.Desc.setText(il.getDescription());

    //bookmarking the post
    holder.book.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            itemListsItems.get(position).isFav = !itemListsItems.get(position).isFav;
            ((ImageView)v.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);

            if(itemListsItems.get(position).isFav){
                String data = Integer.toString(itemListsItems.get(position).id);
                Toast.makeText(v.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
                pref.addPref(data);
            } else {
                String data = Integer.toString(itemListsItems.get(position).id);
                Toast.makeText(v.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
                pref.removePref(data);
            }
            //notifyDataSetChanged();
        }
    });

    ((ImageView)convertView.findViewById(R.id.bookmark_star)).setImageResource(itemListsItems.get(position).isFav ? R.mipmap.active_star : R.mipmap.inactive_star);

    /*
    if(itemListsItems.get(position).isFav){
        String data = Integer.toString(itemListsItems.get(position).id);
        Toast.makeText(convertView.getContext(),"fav hai "+data,Toast.LENGTH_SHORT).show();
        pref.addPref(data);
    } else {
        String data = Integer.toString(itemListsItems.get(position).id);
        //Toast.makeText(convertView.getContext(),"not fav"+ data,Toast.LENGTH_SHORT).show();
        pref.removePref(data);
    }
    */
    return convertView;
}

private static class ViewHolder {
   public TextView Title, Desc,Cat,id;
    ImageView book;
    NetworkImageView img;
}

또한 android:focussable="true"해당 버튼 / 텍스트 매개 변수를 사용 하여 목록 레이아웃을 만들어야합니다 android:focussable="false".


수정 이되어야합니다 안드로이드 : 포커스 =를 "false"로 focussable하지
케니 Dabiri

1

android:focusable="false"버튼에 속성을 추가 하고 부모보기에 android:descendantFocusability="blocksDescendants"이와 같은 속성을 추가 하십시오.

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">

    <ImageButton
        android:id="@+id/sell_button"
        android:layout_width="wrap_content"
        android:focusable="false"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_sell" />
</RelativeLayout>

0

XML이 어떻게 변경되어 java Worked for me에서 setonitemclicked가 발생한다는 것을 알게 된 것은 놀랍습니다 ..

android:descendantFocusability="blocksDescendants"
android:focusable="false"
android:focusableInTouchMode="false"

0

다음과 같이 부모 클릭 가능 속성을 false로 설정합니다 android:clickable="false".

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:orientation="vertical">

다시 문제가 발생하면 모든 하위 뷰에 대해이 클릭 가능한 false를 추가하십시오.


0

이유는 정확히 모르겠지만 어댑터를 설정하면 리스너가 지워지는 경우가 있습니다. 그런 다음 또는 setOnClickListener뒤에 전화해야합니다 .setAdaptersetListAdapter


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