কীভাবে গুলি চালাবেন তালিকার বোতামগুলির সাথে তালিকাসমূহে ক্লিক করুন?


89

আমার কাছে একটি সাধারণ তালিকার ক্রিয়াকলাপ রয়েছে যা তালিকায় দর্শনগুলি তৈরি করতে একটি কাস্টম তালিকাআডাপ্টার ব্যবহার করে। সাধারণত লিস্টএডাপ্টারটি কেবলমাত্র টেক্সটভিউতে ভিউগুলি পূরণ করে, তবে এখন আমি সেখানে একটি বোতামও রাখতে চাই।

তবে এটি আমার উপলব্ধি এবং অভিজ্ঞতা যে তালিকার আইটেমটিতে ফোকাসযোগ্য দৃষ্টিভঙ্গি স্থাপন করা তালিকার আইটেমটি ক্লিক করা হলে তালিকাঅ্যাক্টিভিটিতে অনলিস্টিমেটিক্লিক () গুলি চালানো রোধ করে। বোতামটি তালিকার আইটেমের মধ্যে এখনও স্বাভাবিকভাবে কাজ করে, তবে যখন বোতামের বাইরে কিছু চাপানো হয়, আমি অনিস্টিস্টিক্লিককে ট্রিগার করতে চাই।

আমি এই কাজটি কীভাবে করব?


4
বংশধর ফোকাসিবিলিটি সহ আপনার সমাধানটি সত্যই সহায়ক, আপনার এটি উত্তর হিসাবে যুক্ত করা উচিত এবং এটি গ্রহণ করা উচিত!
ম্যাকসেম গোঁটার

@ ম্যাক্স আমি না করার কারণ কারণ এটি সত্যই খারাপ অভ্যাস, একটি কর্মচঞ্চল। যদি আমি কোনও স্থায়ী স্বাস্থ্যকর সমাধান খুঁজে পাই তবে আমি
সেটির

আমি আপনার মত কাজ দেখতে দেখতে চাই। আমি বংশধরদের ফোকাস সেট করার চেষ্টা করেছি এবং এটি বোতামগুলির সাথে কাজ করতে পারি না। এছাড়াও আমি একটি গ্রিডভিউ (ইমেজভিউস সহ) তালিকার সারিটিতে রাখার চেষ্টা করছি এবং এতে একই রকম সমস্যা রয়েছে।
মিস্টারপুর স্ট্রিটেক

আমি যে আইএমএইচও উত্তর দিয়েছি তা হ'ল র‌্যাম্পস এবং প্রবীণ প্রস্তাবিত সমস্যার জন্য আরও মার্জিত সমাধান। পিএসএন এখানে ভুলে যাওয়া প্রশ্ন পুনরুদ্ধার করার চেষ্টা করছে না তবে আমি দেখতে পাচ্ছি যে আপনি এখনও কোনও উত্তর গ্রহণ করেন নি; ডি
ইওকস ২

@ কোডফিউশনমোবাইল আপনি কি দয়া করে ইওক্সের উত্তরটি গ্রহণ করতে পারবেন? সর্বাধিক ভোট দেওয়া উত্তর ত্রুটিযুক্ত কারণ এটি তালিকাভিউ উপাদানটির জন্য অনক্লিক অ্যানিমেশন অক্ষম করে (যেখানে এটি নীল হয়ে যায়)। এটি অন্য বিকাশকারীদের শীর্ষের উত্তরের চেষ্টা করে কিছুটা সময় সাশ্রয় করতে পারে, এটি ত্রুটিযুক্ত ছিল তা খুঁজে বের করে এবং এরপরে এওক্সের কাছে গিয়েছিল।
1 ''

উত্তর:


99

আমি যেমন পূর্ববর্তী মন্তব্যে সমাধান লিখেছিলাম তা হ'ল ইমেজবুটনে ফোকাসেবল (মিথ্যা)।

আরও বেশি মার্জিত সমাধান রয়েছে তালিকার উপাদানটির android:descendantFocusability="blocksDescendants" মূল বিন্যাসে যুক্ত করার চেষ্টা করুন । এটিলিস্টিমে ক্লিকগুলি সম্ভব করে তুলবে এবং আলাদাভাবে আপনি বাটন বা ইমেজবটন ক্লিকগুলি পরিচালনা করতে পারবেন

আশা করি এটা সাহায্য করবে ;)

চিয়ার্স


4
android:descendantFocusability="blocksDescendants"নিখুঁত ছিল.
ম্যাথু মিচেল

4
আপনি, আমার বন্ধু, আমার ব্যক্তিগত নায়ক। আপনার উচিত সর্বোচ্চ ভোটের হওয়া! এটি প্রায় কোনও ক্ষেত্রেই অনেক বেশি ভাল!
OschtärEi

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটা আমার জন্য পুরোপুরি কাজ করেন। দেখে মনে হচ্ছে তালিকার আইটেমের সমস্ত মতামতকে ফোকাসযোগ্য হতে হবে এবং প্রতিটি স্বতন্ত্রভাবে সেট না করেই এটি এটি করে।
রাশিঞ্জ

4
এটি আমার পক্ষে কাজ করবে বলে মনে হয় না। মূল বিন্যাস দ্বারা, আপনি কি সারি বিন্যাসটি বোঝেন বা যেখানে তালিকার সংজ্ঞা দেওয়া আছে? যাইহোক, আমি সম্ভাব্য সমস্ত সমন্বয় চেষ্টা করেছিলাম .. কাজ করছে না :(
গ্রিনবি

আমি যেমন লিখেছি "তালিকার উপাদানের মূল বিন্যাস" .. সুতরাং আসুন বলে রাখি যে আপনার কাছে তালিকা রয়েছে এবং এতে লেআউট রয়েছে (তাদেরকে তালিকার উপাদানগুলির মূল বিন্যাস বলুন) যার কয়েকটি বাটন, ইমেজবটন, টেক্সটভিউ আছে ..
ইওকস

59

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

আপনি আপনার তালিকার ক্রিয়াকলাপের অনিস্টিস্টিক্লিক () ব্যবহার না করে তা অর্জন করতে পারেন।
আপনার যা করতে হবে তা এখানে:

আপনি কাস্টম লেআউটটি ব্যবহার করছেন, তাই সম্ভবত আপনি নিজের কাস্টম অ্যাডাপ্টার থেকে getView () পদ্ধতিটি ওভাররাইড করছেন। কৌশলটি হ'ল আপনার বোতামের জন্য আলাদা শ্রোতা এবং পুরো দর্শন (আপনার সারি) এর জন্য আলাদা to উদাহরণটি একবার দেখুন:

private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            List<String> objects) {
        super(context, resource, textViewResourceId, objects);
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String text = getItem(position);
        if (null == convertView) {
            convertView = mInflater.inflate(R.layout.custom_row, null);
        }
        //take the Button and set listener. It will be invoked when you click the button.
        Button btn = (Button) convertView.findViewById(R.id.button);
        btn.setOnClickListener(this);
        //set the text... not important     
        TextView tv = (TextView) convertView.findViewById(R.id.text);
        tv.setText(text);
        //!!! and this is the most important part: you are settin listener for the whole row
        convertView.setOnClickListener(new OnItemClickListener(position));
        return convertView;
    }

    @Override
    public void onClick(View v) {
        Log.v(TAG, "Row button clicked");
    }
}

আপনার অন আইটেমক্লিকলিস্টেনার ক্লাসটি এখানে ঘোষিত হতে পারে:

private class OnItemClickListener implements OnClickListener{       
    private int mPosition;
    OnItemClickListener(int position){
        mPosition = position;
    }
    @Override
    public void onClick(View arg0) {
        Log.v(TAG, "onItemClick at position" + mPosition);          
    }       
}

অবশ্যই আপনি অনআইটিক্লিকলিজার কনস্ট্রাক্টরের সাথে আরও কিছু পরামিতি যুক্ত করবেন।
এবং একটি গুরুত্বপূর্ণ বিষয় - উপরে প্রদর্শিত ভিউয়ের বাস্তবায়নটি বেশ কুৎসিত, সাধারণত আপনার ভিউহোল্ডার প্যাটার্নটি ফাইন্ডভিউআইডি কলগুলি এড়াতে ব্যবহার করা উচিত .. তবে আপনি সম্ভবত এটি জানেন।
আমার কাস্টম_রো.এক্সএমএল ফাইলটি আইডি "বাটন" এর বোতামের সাথে রিলেটিভলআউট, আইডি "টেক্সট" এর টেক্সটভিউ এবং আইডি "চিত্র" এর চিত্রদর্শন - কেবল বিষয়গুলি পরিষ্কার করার জন্য।
শ্রদ্ধা!


9
আমার সমাধানটি অন্য পথে চলছে। আমি বংশধরদের অবরুদ্ধ করতে তালিকার সারি বিন্যাসের বংশোক্তির ফোকাসেবিলিটি সম্পত্তি সেট করে সমস্যার সমাধান করেছি এবং হঠাৎ এটি কাজ করে worked ইভেন্টের সেটআপ এবং বোতামগুলির সাথে সম্পর্কিত অন্যান্য অভিনব জিনিসগুলি করার জন্য আমি এখন এটির সাথে সংযুক্ত একটি কাস্টম ভিউবাইন্ডারের সাথে একটি সিম্পল কার্সার অ্যাডাপ্টার ব্যবহার করি।
কোডফিউশনমোবাইল 23

4
আমি এই সমাধানটি ব্যবহার করেছি। যাইহোক, একটি সতর্কতা: যদি আপনার অন্লিক হ্যান্ডলারের ফলে তালিকার বিষয়বস্তু পরিবর্তিত হয়, যার ফলস্বরূপ getView বলা হবে এবং যদি আপনার উইজেট স্থিতিশীল হয় (যেমন একটি টগলবটন বা চেকবক্সের মতো), এবং getView সেই স্থিতি নির্ধারণ করে, আপনি সেট অনিক্লিকলিস্টার সেট করতে চাইতে পারেন (নাল) লুপের প্রভাবটি এড়াতে আপনি অনভিউতে রাষ্ট্র পরিবর্তন করার আগে।
পিয়েরে-লুক পাওর

4
আমার সমাধান কি? আমার মনে আছে যে এটি আরও মার্জিত এবং যখনই আমাদের এটি প্রয়োজন সহজতর প্রয়োগ করা যেতে পারে ..
ইওকস

প্রথম মন্তব্যটি উত্তর হিসাবে গ্রহণ করা উচিত, যাতে আমার মতো লোকদের এটি খুঁজে পেতে কয়েক ঘন্টা প্রয়োজন হবে না
কিবিবি

ধন্যবাদ! এটি দরকারী ছিল। আমি এটি ফোকাসের আরও স্থানীয় বিকল্প হিসাবে পছন্দ করি: অন্যান্য থ্রেডে বর্ণিত ব্লকডেসেন্ডেন্টস পদ্ধতির।
Yoav Shapira

18

যখন একটি কাস্টম তালিকাভিউতে দৃষ্টি আকর্ষণীয় উপাদান থাকে, অনলিস্টিমেটিক্লিক কাজ করবে না (আমি মনে করি এটি প্রত্যাশিত আচরণ)। কেবলমাত্র কাস্টম ভিউ থেকে ফোকাস সরান, এটি কৌশলটি করবে:

উদাহরণ স্বরূপ:

public class ExtendedCheckBoxListView extends LinearLayout {

    private TextView mText;
    private CheckBox mCheckBox;

    public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) {
         super(context);
         …
         mText.setFocusable(false);
         mText.setFocusableInTouchMode(false);

         mCheckBox.setFocusable(false);
         mCheckBox.setFocusableInTouchMode(false);
        …       
    }
}

4
আমি আপনার সমাধানটি পছন্দ করি: প্রতি সারিতে যদি কেবল একটি "ক্লিকযোগ্য" উইজেট থাকে তবে তাদের ফোকাসযোগ্যতা অস্বীকার করা একটি মার্জিত সমাধান। এর অর্থ এই নয় যে সারিটির যে কোনও জায়গায় একটি ট্যাপ মিলবে, তবে যখন উইজেটটি রেডিও বা চেকবক্স হয় তখন এটি কার্যকর ব্যবহার। এক্সএমএলে অ্যান্ড্রয়েড: ফোকাসযোগ্য = "মিথ্যা" এবং অ্যান্ড্রয়েড: ফোকাসেবলআইএনটিচমোড = "ভুয়া" ব্যবহার করে এটিই অর্জন করা যায়।
পিয়েরে-লুক পাওর

4
আপনি দৃশ্যমানতা পরিবর্তন করলে
xML উপায়টি

13

আমার একই সমস্যা: অনলিস্টিমেটিক্লিক বরখাস্ত নয়! [সলভড]
লিস্টঅ্যাক্টিভিটির
একটি লেআউট যা টেক্সটবক্স এবং লিস্টভিউতে
লাইনারালাইউটে এবং সারিগুলির জন্য অন্য একটি বিন্যাসে আটকানো রয়েছে (লাইনরালাউটটিতে একটি চেকবক্স এবং টেক্সটবক্স নীচে) রয়েছে এমন ক্লাসে এটি ঘটেছিল List

এটি কোড:

রেজ / লেআউট / কনফিগারেশন.এক্সএমএল (তালিকার কার্যকলাপের জন্য মূল)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent" > 
    <TextView  
        android:id="@+id/selection"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="pippo" /> 
    <ListView  
        android:id="@android:id/list"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:drawSelectorOnTop="false"  
        android:background="#aaFFaa" > 
    </ListView> 
<LinearLayout> 

res/layout/row.xml (layout for single row)  
<LinearLayout  
  xmlns:android="http://schemas.android.com/apk/res/android"  
  android:layout_width="fill_parent"  
  android:layout_height="wrap_content"> 
  <CheckBox  
      android:id="@+id/img"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      **android:focusable="false"**  
      **android:focusableInTouchMode="false"** /> 

  <TextView  
      android:id="@+id/testo"  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      **android:focusable="false"**  
      **android:focusableInTouchMode="false"** /> 
</LinearLayout> 

src /.../.../ configPage.java

public class ConfigPage extends ListActivity
{
    TextView selection;

    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.configpage);  
        // loaded from res/value/strings  
        String[] azioni = getResources().getStringArray(R.array.ACTIONS);  
        setListAdapter(new ArrayAdapter&lt;String&gt;(this, R.layout.row, 
                R.id.testo,   azioni));  
        selection = (TextView) findViewById(R.id.selection);  
    }       

    public void onListItemClick(ListView parent, View view, int position, long id)
    {
        selection.setText(" " + position);
    }
}

আমি সারি.এক্সএমএল যুক্ত করার পরে এটি কাজ শুরু করে

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

আমি Eclipse 3.5.2
Android SDK 10.0.1
মিনিট SDK সংস্করণ ব্যবহার করি: 3

আমি আশা করি এটি সহায়ক
... এবং আমার ইংরাজির জন্য দুঃখিত :(


@ ফেলানরা জানেন না কেন, তবে এটি আমার পক্ষে কার্যকর হয়নি। আমার অনলাইনলিস্টিক্লিক কল করা হচ্ছে না।
likejudo

আপনি কি বৈশিষ্ট্যাবলী কোড অ্যান্ড্রয়েড যুক্ত করেছেন: ফোকাসযোগ্য = "মিথ্যা" এবং অ্যান্ড্রয়েড: ফোকাসেবল আইএনটিচমোড = "ভুয়া" কোড?
রেফেলন

2

শুধু android:focusable="false"আপনার বোতামের একটি বৈশিষ্ট্য হিসাবে যুক্ত করুন


1

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

অবশ্যই, এখন তালিকার সারিতে আপনার ফোকাসযোগ্য দর্শনগুলি মনোনিবেশযোগ্য, কীবোর্ড ব্যবহারকারী ব্যবহারকারীদের সমস্যা হতে পারে, ভাল, তাদের ফোকাস করে। এটি কোনও সমস্যা হওয়ার সম্ভাবনা নেই তবে আপনি যদি 100% ত্রুটিবিহীন অ্যাপ্লিকেশন লিখতে চান তবে আপনি নির্বাচিত সারির উপাদানগুলিকে ফোকাসযোগ্য করে তোলার জন্য এবং আগের নির্বাচিত সারির উপাদানগুলিকে অন-ফোকাসযোগ্য করে তুলতে অন আইটেমলেক্ট ইভেন্টটি ব্যবহার করতে পারেন।


আমি এই পদ্ধতির ব্যবহার। এটি সহজতম উপায়, যদি আপনি পৃথক আইটেমগুলিতে ফোকাস করতে না পারার বিষয়টি পেতে পারেন। এটি তালিকার আইটেমগুলির যেমন হওয়া উচিত তেমনভাবে রাজ্যটিকেও আঁকতে সক্ষম করে রাখে, যা অন্য কোনও কাজের ক্ষেত্রে নেই।
জোনাথন এস

1
 ListView lv = getListView();
lv.setTextFilterEnabled(true);

lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
    int position, long id) {
  // When clicked, show a toast with the TextView text
  Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
      Toast.LENGTH_SHORT).show();
}
});

-1

আমি getListAdapter () ব্যবহার করেছি। GetItem (অবস্থান) এমন একটি বস্তুর ইনস্ট্যান্ট করে যা আইটেমের মধ্যে আমার মানগুলিকে ধারণ করে holds

MyPojo myPojo = getListAdapter().getItem(position);

তারপরে myPojo থেকে প্রাপ্ত পদ্ধতিটি এটি আইটেমের মধ্যে তার যথাযথ মানগুলি কল করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.