তালিকাভিউ সেটঅনআইটেমক্লিকলিস্টনার বোতাম যুক্ত করে কাজ করছে না


92

আমার প্রতিটি সারিতে পাঠ্য এবং বোতাম সহ একটি তালিকা ভিউ রয়েছে, তালিকা প্রদর্শন সেটঅনটাইমক্লিকলিস্টার () কাজ করছে না। আইটেম ক্লিক এবং বোতাম ক্লিক ইভেন্টগুলিকে আলাদাভাবে পরিচালনা করা সম্ভব (আইটেম ক্লিকের ক্রিয়াকলাপে কল করা উচিত এবং বোতাম ক্লিককে ক্রিয়াকলাপে কল করা উচিত)। কারো কাছে কি কোন সমাধান আছে

    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"

@ বেন লি: আমি এগুলি আমার চেকবক্সগুলিতে যুক্ত করেছি! এখনও কাজ করছে না. আমি কী ভুল করছি?
টিডিভার

4
android:focusableInTouchMode="false"আমার সমাধান। আমি একটি কাস্টম লিনিয়ারলআউট সারিতে দুটি টেক্সটভিউ ব্যবহার করি। ইউক অ্যান্ড্রয়েড ...
ইয়ংজায়ে

12
ইমেজবাটন কাজ করবে না। তালিকার আইটেম ভিউতে ইমেজবটন রয়েছে, অ্যান্ড্রয়েড সেট করুন: বংশধর ফোকাসেবলি = "ব্লকডেসেন্ডেন্টস"।
চ্যাঙ্গুজেড

8
অ্যান্ড্রয়েড যুক্ত করুন: ক্লিকযোগ্য = "মিথ্যা" এরও প্রয়োজন হতে পারে (এটিকে এক্সএমএলে স্পষ্টভাবে যুক্ত করার জন্য লেআউট ডিজাইনারে এটি টগল করা, এবং অফ করা)
জুন

11
সতর্কতা: আপনি যদি ইমেজবটন ব্যবহার করছেন সে ক্ষেত্রে আপনাকে সেটফোক্সেবল (মিথ্যা) ব্যবহার করতে হবে কারণ ইমেজবুটনের নির্মাতাকে এক্সএমএল ফাইল থেকে স্ফীত করার পরে এই বৈশিষ্ট্যটি নিষ্ক্রিয় করবে। তবে ভাল উত্তর যদিও
মাতু

120

কখনও কখনও তালিকাটি এখনও ক্লিক শ্রোতাদের পাস করতে সক্ষম হয় না। এবং এই ক্ষেত্রে আপনাকে আরও একটি বৈশিষ্ট্য যুক্ত করতে হতে পারে।

android:descendantFocusability="blocksDescendants" 

এবং এই বৈশিষ্ট্যটি আপনার এক্সএমএলের শীর্ষ সর্বাধিক বিন্যাসে যুক্ত করতে হবে যেখানে আপনি তালিকার ভিউ উপাদান সরবরাহ করেছেন।


ঠিক তেমন কেউই আমি স্রেফ যা করে তা করে না: এটির অনাকাঙ্ক্ষিত হবে যদি আপনার সারিটিতে একটি সম্পাদনা পাঠ্যের মতো ফোকাসের প্রয়োজন হয়। আমি এখন বোকা বোধ করছি।
কিতালদা

আমার ক্ষেত্রে এই পরামর্শ সাহায্য করেছে। আমার কাছে একটি টেক্সটভিউ এবং রেডিওবটন আছে, 1 ম ক্লিক করেনি, 2 য় পাঠ্যদর্শনটি নির্বাচন করেনি। আমি রেডিওবাটনে "অ্যান্ড্রয়েড: ক্লিকযোগ্য =" মিথ্যা "" লিখেছি।
কুলমাইন্ড

বোতামটি যখন ইমেজবটন হয় তখনই এটি সমাধান হয়
মাহনস্টার

কৌতূহলীভাবে, এই সমাধানটি আমার পক্ষে কাজ করেছিল। অনআইটম ক্লিকলিস্টার বংশধর ইভেন্টগুলিকে প্রভাবিত না করে কাজ করে। কেন এটি কাজ করেছে তা নিশ্চিত নয়, সুতরাং ... চিত্র দেখুন।
এক

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

4
এটি কীভাবে আরও দূরবর্তী থেকে আরও ভাল? আপনি কেবলমাত্র 1 শ্রোতা বনাম প্রত্যেকটি ডেটা উপাদানগুলির জন্য একটি ক্লিকলিস্টেনার তৈরি করছেন। আপনি উদাহরণস্বরূপ এমনকি কোন দর্শন পুনর্ব্যবহার করেন না।
JRomero

@ জে রোমেরো এটি কেবল একটি উদাহরণ, যদিও কোড অপ্টিমাইজেশনের জন্য লুটপাট রয়েছে। তবে আমি সবেমাত্র কোড আপডেট করেছি।
আদিল সোমো

5

সেট চেষ্টা setClickable(false)প্রত্যেকের জন্য Button, ImageButtonইত্যাদি এবং Viewএই মত:

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

এছাড়াও আপনি যোগ করতে হবে

android:descendantFocusability="blocksDescendants"

প্রধান (প্রথম স্তর) বিন্যাসে


4
আমি সেট পেয়েছি ব্লকসেটেন্ডেন্টস যথেষ্ট, ফোকাসযোগ্য ইত্যাদি বাতিল করার দরকার নেই অ্যান্ড্রয়েড 4.1
ডিজেড্যান্স

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"


সংশোধন করা হয়েছে এটি অ্যান্ড্রয়েড হওয়া উচিত : ফোকাসযোগ্য = "মিথ্যা" ফোকাসযোগ্য নয়
কেনি

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

এটি লক্ষ্য করে আশ্চর্য হওয়া যায় যে এক্সএমএল কীভাবে পরিবর্তিত হয়েছিল তা জাভাতে সেটোনাইটমিক্লিক হয়ে যায় যা আমার জন্য কাজ করেছিল ..

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.