অ্যান্ড্রয়েডের আইটেমগুলিতে কাস্টম তালিকাভিউ ক্লিক করুন ইস্যু


110

সুতরাং আমি একটি কাস্টম তালিকা ভিউ অবজেক্ট আছে। তালিকার আইটেমগুলিতে একে অপরের শীর্ষে দুটি পাঠ্যদর্শন রয়েছে এবং প্লাস একটি অনুভূমিক অগ্রগতি বার যা আমি আসলে কিছু না করা পর্যন্ত গোপন রাখতে চাই। ডানদিকে ডানদিকে একটি চেকবক্স যা আমি কেবল তখনই প্রদর্শন করতে চাই যখন যখন ব্যবহারকারীকে তাদের ডাটাবেসগুলিতে আপডেটগুলি ডাউনলোড করতে হবে। আমি যখন ভিজিবিলিটির জন্য দৃশ্যমানতাটি সেট করে চেকবক্সটি অক্ষম করি ON GONE, আমি তালিকা আইটেমগুলিতে ক্লিক করতে সক্ষম হয়েছি। যখন চেকবক্সটি দৃশ্যমান হয়, তখন আমি চেকবক্সগুলি ব্যতীত তালিকার কোনও কিছুতে ক্লিক করতে অক্ষম। আমি কিছু অনুসন্ধান করেছি কিন্তু আমার বর্তমান পরিস্থিতির সাথে প্রাসঙ্গিক কিছু পাইনি। আমি এই প্রশ্নটি খুঁজে পেয়েছিঅভ্যন্তরীণভাবে ডাটাবেসের তালিকা অন্তর্ভুক্ত করার জন্য অ্যারেলিস্টগুলি ব্যবহার করছি বলে আমি একটি ওভাররাইড অ্যারেএডাপ্টার ব্যবহার করছি। টমের মতো আমাকে কি কেবল লিনিয়ারলআউট ভিউটি পেতে এবং একটি ক্লিকক্লিসলিটর যুক্ত করা দরকার? আমি নিশ্চিত নই.

এখানে তালিকা ভিউ সারি বিন্যাস XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="0dip"
        android:layout_weight="1"
        android:layout_height="fill_parent">
        <TextView
            android:id="@+id/UpdateNameText"
            android:layout_width="wrap_content"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:textSize="18sp"
            android:gravity="center_vertical"
            />
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:id="@+id/UpdateStatusText"
            android:singleLine="true"
            android:ellipsize="marquee"
            />
        <ProgressBar android:id="@+id/UpdateProgress" 
                     android:layout_width="fill_parent" 
                     android:layout_height="wrap_content"
                     android:indeterminateOnly="false" 
                     android:progressDrawable="@android:drawable/progress_horizontal" 
                     android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal" 
                     android:minHeight="10dip" 
                     android:maxHeight="10dip"                    
                     />
    </LinearLayout>
    <CheckBox android:text="" 
              android:id="@+id/UpdateCheckBox" 
              android:layout_width="wrap_content" 
              android:layout_height="wrap_content" 
              />
</LinearLayout>

এবং এখানে ক্লাসটি তালিকার ক্রিয়াকলাপকে প্রসারিত করে। স্পষ্টতই এটি এখনও বিকাশে রয়েছে তাই যে জিনিসগুলি অনুপস্থিত রয়েছে বা যা কিছু পড়ে থাকতে পারে তা ক্ষমা করুন:

public class UpdateActivity extends ListActivity {

    AccountManager lookupDb;
    boolean allSelected;
    UpdateListAdapter list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lookupDb = new AccountManager(this);
        lookupDb.loadUpdates();

        setContentView(R.layout.update);
        allSelected = false;

        list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems());
        setListAdapter(list);

        Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister);
        btnEnterRegCode.setVisibility(View.GONE);

        Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll);
        btnSelectAll.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                allSelected = !allSelected;

                for(int i=0; i < lookupDb.getUpdateItems().size(); i++) {
                    lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected());
                }

                list.notifyDataSetChanged();
                // loop through each UpdateItem and set the selected attribute to the inverse 

            } // end onClick
        }); // end setOnClickListener

        Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
        btnUpdate.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
            } // end onClick
        }); // end setOnClickListener

        lookupDb.close();
    } // end onCreate


    @Override
    protected void onDestroy() {
        super.onDestroy();

        for (UpdateItem item : lookupDb.getUpdateItems()) {
            item.getDatabase().close();        
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        UpdateItem item = lookupDb.getUpdateItem(position);

        if (item != null) {
            item.setSelected(!item.isSelected());
            list.notifyDataSetChanged();
        }
    }

    private class UpdateListAdapter extends ArrayAdapter<UpdateItem> {
        private List<UpdateItem> items;

        public UpdateListAdapter(Context context, int textViewResourceId, List<UpdateItem> items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = null;

            if (convertView == null) {
                LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = li.inflate(R.layout.update_row, null);
            } else {
                row = convertView;
            }

            UpdateItem item = items.get(position);

            if (item != null) {
                TextView upper = (TextView)row.findViewById(R.id.UpdateNameText);
                TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText);
                CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox);

                upper.setText(item.getName());
                lower.setText(item.getStatusText());

                if (item.getStatusCode() == UpdateItem.UP_TO_DATE) {
                    cb.setVisibility(View.GONE);
                } else {
                    cb.setVisibility(View.VISIBLE);
                    cb.setChecked(item.isSelected());
                }

                ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress);
                pb.setVisibility(View.GONE);
            }
            return row;
        }

    } // end inner class UpdateListAdapter
}

সম্পাদনা: আমার এখনও এই সমস্যা হচ্ছে। আমি প্রতারণা করছি এবং পাঠ্যদর্শনগুলিতে ক্লিক হ্যান্ডলারগুলি যুক্ত করছি তবে এটি অত্যন্ত বোকামি বলে মনে হচ্ছে যে আমি আমার চেকবক্সে ক্লিক না করে আমার অনলিস্টিমেটিক্লিক () ফাংশনটি বলা হচ্ছে না।

উত্তর:


243

সমস্যাটি হ'ল অ্যান্ড্রয়েড আপনাকে সেই আইটেমগুলিকে ফোকাসযোগ্য list আমি তালিকা আইটেমের চেকবক্সটি এমন একটি বৈশিষ্ট্য রাখতে পরিবর্তন করেছি:

android:focusable="false"

এখন আমার তালিকার আইটেমগুলিতে যা চেকবাক্সগুলি রয়েছে (বোতামগুলির জন্যও কাজ করে) traditionalতিহ্যগত অর্থে "নির্বাচনযোগ্য" (তারা আলোকিত হয়, আপনি তালিকার আইটেমের যে কোনও জায়গায় ক্লিক করতে পারেন এবং "অনলিস্টিমেটিক্লিক" হ্যান্ডলার আগুন জ্বালিয়ে দেবে ইত্যাদি)।

সম্পাদনা: আপডেট হিসাবে, একজন মন্তব্যকারী "বোতামটির দৃশ্যমানতা পরিবর্তন করার পরে, কেবলমাত্র ফোকাসটি প্রোগ্রামিকভাবে অক্ষম করতে হয়েছিল," কেবল একটি নোট উল্লেখ করেছে mentioned


24
ইমেজবটন তালিকা আইটেম ব্যবহৃত হয় যখন এই সমাধান কাজ করে না প্রদর্শিত হবে। :(
জুলিয়ান এ।

1
ঠিক আছে তবে আমি যদি আমার চেকবক্স এবং আমার তালিকার ভিউ ক্লিকটি পারস্পরিক একচেটিয়া হতে পারি? আমি যদি তালিকাভিউ আইটেমটি নির্বাচন করি তবে আমি অবশ্যই চেকবক্সটি চেক করতে চাই না। এই সমাধান দিয়ে কি এটি সম্ভব?
মাইক 6679

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

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

1
আপনার অ্যান্ড্রয়েডও সেট করতে হবে: ক্লিকযোগ্য = "মিথ্যা"
মিনা সামি

43

তালিকার আইটেমটির ভিতরে আপনার যদি ইমেজবাটন থাকে তবে descendantFocusabilityআপনার মূল তালিকা আইটেমের উপাদানটিতে 'blockDescendants' এ মান নির্ধারণ করা উচিত ।

android:descendantFocusability="blocksDescendants"

আর focusableInTouchModeপতাকা trueমধ্যে ImageButtonদৃশ্য।

android:focusableInTouchMode="true"

1
এটি লিস্টাইটেমের ইমেজব্যাটনের জন্য পুরোপুরি কাজ করে। তবে এটি ইমেজবাটন ব্যতীত কাজ করতে পারে
রিক্সা

12

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

আমি এই ভিউ অবজেক্টটিও সন্ধান করতে চাই, এটি চেকবক্সের চেয়ে আরও ভাল কাজ করতে পারে

চেক করা পাঠ্য দর্শন


6
আমি খুঁজে পেয়েছি যে আপনি যদি তালিকায় ফোকাসযোগ্য আইটেমগুলির জন্য "ফোকাসযোগ্য" সেটিংসটিকে মিথ্যা হিসাবে সেট করেন তবে আপনি নিজের onListItemClick ফাংশনটি আবার ব্যবহার করতে পারেন।
ম্যাটসি

2
তবে চেকবক্সটি তালিকা আইটেমের মতো কমলাতে পরিণত হয়। এর সমাধান কি কেউ জানেন?
এরদোমিস্টার

8

তালিকা আইটেমের রুট ভিউতে এই লাইনটি ব্যবহার করুন

অ্যান্ড্রয়েড descendantFocusability = "blocksDescendants"

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