ListView setOnItemClickListener ไม่ทำงานโดยการเพิ่มปุ่ม


92

ฉันมีมุมมองรายการที่มีข้อความและปุ่มในแต่ละแถวมุมมองรายการ 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"

@ เบ็นลี: ฉันเพิ่มสิ่งเหล่านี้ในช่องทำเครื่องหมายของฉัน! ยังไม่ทำงาน ฉันจะทำอะไรผิด?
TDaver

1
android:focusableInTouchMode="false"แก้ปัญหาของฉัน ฉันใช้ TextView สองรายการในแถว LinearLayout ที่กำหนดเอง Yuk android ...
Youngjae

12
ImageButton จะไม่ทำงาน ในมุมมองรายการประกอบด้วย ImageButton ตั้งค่า android: inheritantFocusability = "blocksDescendants"
ChangUZ

8
การเพิ่ม android: clickable = "false" ได้เช่นกัน (เปิดและปิดในตัวออกแบบเลย์เอาต์เพื่อเพิ่มลงใน XML อย่างชัดเจน)
jrg

11
คำเตือน: ในกรณีที่คุณใช้ ImageButton คุณจำเป็นต้องใช้ setFocusable (false) ทำให้คอนสตรัคเตอร์ของ ImageButton เปิดใช้งานแอตทริบิวต์นี้หลังจากขยายจากไฟล์ xml แต่คำตอบที่ดี
Mateu

120

บางครั้ง List จะยังไม่สามารถทำให้ Click Listener ผ่านไปได้ และในกรณีนี้คุณอาจต้องเพิ่มแอตทริบิวต์อีกหนึ่งรายการ

android:descendantFocusability="blocksDescendants" 

และจะต้องเพิ่มแอตทริบิวต์นี้ลงในเลย์เอาต์ XML ส่วนใหญ่บนสุดซึ่งคุณได้จัดเตรียมองค์ประกอบ ListView ไว้


ไม่มีใครทำในสิ่งที่ฉันเพิ่งทำ: สิ่งนี้จะไม่เป็นที่พึงปรารถนาหากคุณมีบางสิ่งที่ต้องการโฟกัสในแถวของคุณเช่น EditText ตอนนี้ฉันรู้สึกโง่
Kitalda

ในกรณีของฉันคำแนะนำนี้ช่วยได้ ฉันมี TextView และ RadioButton อันที่ 1 ไม่ได้คลิกครั้งที่ 2 ไม่ได้เลือก TextView ฉันเขียน "android: clickable =" false "" ใน RadioButton
CoolMind

นี่คือวิธีแก้ปัญหาเมื่อปุ่มเป็น ImageButton
Mahonster

อยากรู้อยากเห็นวิธีนี้ใช้ได้ผลสำหรับฉัน OnItemClickListener ทำงานโดยไม่มีผลต่อเหตุการณ์ที่สืบเนื่องมา ไม่แน่ใจว่าทำไมถึงใช้งานได้ดังนั้น ... ไปคิด
ONE

15

หากคุณมีมุมมองที่ใช้งานอยู่ / มุมมองที่โฟกัสได้ในมุมมองรายการของคุณมันจะปิดใช้งานonItemClickListener... คุณสามารถพยายามทำให้ไม่โฟกัสได้โดยเพิ่ม: android:focusable="false"ไปยังมุมมองใด ๆ ที่มักจะโฟกัสได้


8

สิ่งปะทะคือการเพิ่มทั้งListenerไปทั้งของrowViewและไปภายในButton 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 สำหรับทุกองค์ประกอบข้อมูลเทียบกับผู้ฟังเพียง 1 คน ตัวอย่างของคุณไม่ได้รีไซเคิลมุมมองใดด้วยซ้ำ
JRomero

@ J.Romero นี่เป็นเพียงตัวอย่างเท่านั้นแม้ว่าจะมีที่ว่างสำหรับการเพิ่มประสิทธิภาพโค้ด อย่างไรก็ตามฉันเพิ่งอัปเดตโค้ด
Adil Soomro

5

พยายามที่จะตั้งค่าsetClickable(false)สำหรับแต่ละButton, ImageButtonฯลฯ และViewเช่นนี้

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

นอกจากนี้คุณต้องเพิ่ม

android:descendantFocusability="blocksDescendants"

ไปยังเค้าโครงหลัก (ระดับแรก)


2
ฉันพบว่า set blockDescendants ก็เพียงพอแล้วไม่จำเป็นต้องยกเลิก focusable เป็นต้น Android 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

ฉันยังได้รับข้อผิดพลาดเดียวกัน หากในรายการรูปแบบคุณมีปุ่มใด ๆ ที่จะแทนที่ด้วยTextViewเช่นกับImageButton 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"


แก้ไขแล้วควรเป็นandroid: focusable = "false"ไม่โฟกัสได้
Kenny 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 ทำให้ setonitemclicked ใน java ทำงานให้ฉันได้อย่างไร ..

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

0

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">

ประสบปัญหาอีกครั้งจากนั้นสำหรับมุมมองเด็กทั้งหมดให้เพิ่มเท็จที่คลิกได้นี้


0

ฉันไม่รู้ว่าทำไม แต่บางครั้งเมื่อคุณตั้งอะแดปเตอร์ตัวฟังจะถูกล้าง จากนั้นคุณจะต้องเรียกsetOnClickListenerหลังจากหรือsetAdaptersetListAdapter


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.