software - java apps for nokia




অ্যানড্রইড কাস্টম ListView আইটেম ক্লিক করতে অক্ষম (3)

আমি একটি অনুরূপ সমস্যা ঘটেছে এবং একটি ListView মধ্যে চেকবক্স বরং চটচটে যে পাওয়া গেছে। কী ঘটেছে এটি সমগ্র তালিকাতে এটির ইচ্ছাকে প্রযোজ্য করে এবং অনলাইটআইটিম ক্লিকে ওভাররাইড করে। আপনি তার জন্য একটি ক্লিক হ্যান্ডলার বাস্তবায়ন করতে পারেন এবং পাঠ্যবই ব্যবহার করার পরিবর্তে চেকবক্সের জন্য পাঠ্য সম্পত্তি সেট করতে পারেন।

আমি এই দৃশ্য বস্তুটিও দেখতে চাই, এটি চেকবক্সের চেয়ে ভাল কাজ করতে পারে

চেক করা টেক্সট দেখুন

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

এখানে তালিকা দেখুন সারি বিন্যাস এক্সএমএল:

<?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
}

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


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

android:focusable="false"

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

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


যদি আপনার আইটেম আইটেমের ভিতরে চিত্রবটন থাকে তবে আপনি মূল তালিকা আইটেম উপাদানতে 'ব্লকডেস্কেন্ডেন্টস' এ অবজেক্ট ফোকাসযোগ্যতা মান সেট করতে হবে।

android:descendantFocusability="blocksDescendants"

এবং focusableInTouchMode ফ্ল্যাগটি true

android:focusableInTouchMode="true"




android