কীভাবে অ্যান্ড্রয়েডে একটি তালিকাভিউ গতিশীলভাবে আপডেট করবেন [বন্ধ]


159

অ্যান্ড্রয়েডে, আমি কীভাবে ListViewএমন একটি ফিল্টার করতে পারি যে ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে, যেখানে প্রদর্শিত আইটেমগুলি গতির পরিবর্তে TextViewমানের ভিত্তিতে আপডেট করা হয়?

আমি এই জাতীয় কিছু খুঁজছি:

-------------------------
| Text View             |
-------------------------
| List item             |
| List item             |
| List item             |
| List item             |
|                       |
|                       |
|                       |
|                       |
-------------------------

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

দয়া করে প্রশ্নটি আবার খুলুন। এটি স্পষ্টভাবে সহায়ক।
সাইলেন্টনট

উত্তর:


286

প্রথমত, আপনাকে একটি এক্সএমএল লেআউট তৈরি করতে হবে যা এডিট টেক্সট এবং একটি তালিকাভিউ উভয়ই রাখে।

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Pretty hint text, and maxLines -->
    <EditText android:id="@+building_list/search_box" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="type to filter"
        android:inputType="text"
        android:maxLines="1"/>

    <!-- Set height to 0, and let the weight param expand it -->
    <!-- Note the use of the default ID! This lets us use a 
         ListActivity still! -->
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
         /> 

</LinearLayout>

এটি তালিকাভিউর উপরে একটি দুর্দান্ত সম্পাদনা পাঠ্য সহ সঠিকভাবে সবকিছু ঠিকঠাক করে দেবে। এরপরে, আপনি সাধারণত হিসাবে একটি তালিকাঅ্যাক্টিভিটি তৈরি করুন, তবে পদ্ধতিতে একটি setContentView()কল যুক্ত করুন onCreate()যাতে আমরা আমাদের সম্প্রতি ঘোষিত বিন্যাসটি ব্যবহার করি। মনে রাখবেন যে আমরা ListViewবিশেষভাবে আইডি করেছি android:id="@android:id/list"। এটি আমাদের ঘোষিত বিন্যাসে আমরা ListActivityকোনটি ListViewব্যবহার করতে চাই তা জানতে দেয় ।

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

        setContentView(R.layout.filterable_listview);

        setListAdapter(new ArrayAdapter<String>(this,
                       android.R.layout.simple_list_item_1, 
                       getStringArrayList());
    }

অ্যাপ্লিকেশন চালানো এখন ListViewউপরের একটি দুর্দান্ত বাক্স সহ আপনার পূর্ববর্তীটি দেখানো উচিত । সেই বাক্সটি কিছু করার জন্য, আমাদের এটি থেকে ইনপুট নেওয়া উচিত এবং সেই ইনপুটটিকে ফিল্টার তালিকা তৈরি করতে হবে। যদিও অনেক লোক এটি ম্যানুয়ালি করার চেষ্টা করেছেন, বেশিরভাগ ListView Adapter ক্লাস এমন একটি Filterজিনিস নিয়ে আসে যা স্বয়ংক্রিয়ভাবে ফিল্টারিং সম্পাদন করতে ব্যবহৃত হতে পারে। আমরা শুধু পাইপ থেকে ইনপুট দরকার EditTextমধ্যে Filter। পরিণত হয়েছে যে বেশ সহজ। দ্রুত পরীক্ষা চালানোর জন্য, আপনার onCreate()কলটিতে এই লাইনটি যুক্ত করুন

adapter.getFilter().filter(s);

লক্ষ্য করুন যে ListAdapterএই কাজটি করতে আপনাকে আপনার একটি ভেরিয়েবলে সংরক্ষণ করতে হবে - আমি আমার ArrayAdapter<String>আগে থেকে 'অ্যাডাপ্টার' নামক একটি ভেরিয়েবলে সংরক্ষণ করেছি ।

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

private EditText filterText = null;
ArrayAdapter<String> adapter = null;

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

    setContentView(R.layout.filterable_listview);

    filterText = (EditText) findViewById(R.id.search_box);
    filterText.addTextChangedListener(filterTextWatcher);

    setListAdapter(new ArrayAdapter<String>(this,
                   android.R.layout.simple_list_item_1, 
                   getStringArrayList());
}

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterText.removeTextChangedListener(filterTextWatcher);
}

7
এই সমাধানটির মতো ফ্যাশন "শুরু" এর পরিবর্তে "ভিটামিনে" তালিকাভিউতে ফিল্টার করার কোনও সোজা উপায় আছে কি?
ভিক্টর ব্রেয়ান

12
ভিক্টর - আপনার আগ্রহী শব্দগুলি যদি ফাঁক দিয়ে আলাদা হয় তবে এটি স্বয়ংক্রিয়ভাবে এটি করবে do অন্যথায়, আসলে না। সম্ভবত সবচেয়ে সহজ উপায় হ'ল অ্যাডাপ্টারটি প্রসারিত করে সাবক্লাস করা এবং আপনি যে নির্দিষ্ট ফিল্টার অবজেক্টটি নির্ধারণ করেছেন সেটিকে ফেরত পেতে getFilter পদ্ধতিটি ওভাররাইড করে। দেখুন github.com/android/platform_frameworks_base/blob/master/core/... এটা এই কোড এবং পরিবর্তন লাইন 479 এবং 486 95% কপি নিতান্তই সহজ হয়ে যাবে - বুঝতে ডিফল্ট ArrayFilter কাজ
Hamy

2
হ্যামি, চমৎকার লেখার ব্যবস্থা! যদিও আমার একটি প্রশ্ন রয়েছে: আমি এটি প্রয়োগ করেছি এবং আমি যে প্রতিটি চিঠি লিখি তার পরে তালিকাভিউ কয়েক সেকেন্ডের জন্য অদৃশ্য হয়ে যায় এবং তারপরে ফিরে আসে, ফিল্টার হয়। আপনি এটা অভিজ্ঞতা আছে? আমার অন্তর্নিহিততা হ'ল কারণ আমার তালিকায় +০০++ আইটেম রয়েছে, তুচ্ছ তুচ্ছ স্ট্রিং () ফাংশন রয়েছে।
লোয়েল্ক

2
একটি ছোট স্ক্রিনে ল্যান্ডস্কেপ মোডে, সম্পাদনা পাঠ্য + কীবোর্ড পুরো পর্দা নেয় এবং তালিকাগুলি দৃশ্যমান নয়! কোন সমাধান?
মার্টিন কোনিসেক

4
এটি কি সত্যিই প্রয়োজনীয়? > অনডেস্ট্রয়ে ()
জোজো

10

প্রোগ্রাম চালানো একটি শক্তি ঘনিষ্ঠ হতে পারে।

আমি লাইনটি পরিবর্তন করেছি:

অ্যান্ড্রয়েড: ID = "@ + + building_list / SEARCH_BOX- এর"

সঙ্গে

অ্যান্ড্রয়েড: ID = "@ + + ID / SEARCH_BOX- এর"

সেটা কি সমস্যা হতে পারে? '@ + বিল্ডিং_লিস্ট' কী?


জোহ, আপনি যখন আর.আইডি. কিছু বলেন, আইডিতে কিছু উপস্থিত থাকে কারণ আপনি অ্যান্ড্রয়েড বলেছিলেন: id = "@ + id / search_box"। যদি আপনি অ্যান্ড্রয়েড বলে থাকেন: id = "@ + বিল্ডিং_লিস্ট / অনুসন্ধান_বক্স" তবে কোডে আপনি ফাইন্ড ভিউআইডি (আর। বিল্ডিং_লিস্ট.সন্ধান_বক্স) কল করতে পারেন; আপনি যে শীর্ষ স্তরের ব্যতিক্রম পাচ্ছেন তা কী? এই কোডটি ডাব্লু / ওএ পরীক্ষার সংকলনটি অনুলিপি করা হয়েছে, সুতরাং আমি সম্ভবত কমপক্ষে একটি ত্রুটি কোথাও রেখেছি
হামি

হাই হ্যামি, আপনি কোডটিতে "@ + বিল্ডিং_লিস্ট / অনুসন্ধান_বক্স" "ফিল্টারটেক্সট = (এডিট টেক্সট) ফাইন্ড ভিউবিআইআইডি (R.id.search_box) সহ উল্লেখ করেছেন;" সে কারণেই আমি ভাবছিলাম।
j7nn7k

1
টাইপ করা শুরু করার সময় ফোর্সক্লোজ অ্যাকোয়ার্স the ত্রুটির অংশ: ERROR / AndroidRunটাইম (188): জাভা.আলং.নুলপয়েন্টার এক্সসেপশন 02-11 07: 30: 29.828: ইআরআরআর / অ্যান্ড্রয়েড রুনটাইম (188): xxx.com.ListFilter $ 1 এ। onTextChanged (listFilter.java:46) 02-11 07: 30: 29.828: এরআর / অ্যান্ড্রয়েড রুনটাইম (188): এ android.widget.TextView.sendOnTextChanged (TextView.java:6102) 02-11 07: 30: 29.828: ERROR / অ্যান্ড্রয়েডআরটাইম (188): এন্ড্রয়েড.উইজেট.টেক্সটভিউ.হান্ডেলটেক্সট চেঞ্জড (টেক্সটভিউ.জভা: 14১৪৩) ২১-১১ 07: 30: 29.828: এআরআর / অ্যান্ড্রয়েড রুনটাইম (188): এন্ড্রয়েড.উইজেট.টেক্সটভিউ $ চেঞ্জওয়াটার.অনেকটাভিজ : 6286)
j7nn7k

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

4

ফিল্টারিংয়ে আমার সমস্যা ছিল, ফলাফলগুলি ফিল্টার করা হয়েছে, তবে পুনরুদ্ধার করা হয়নি !

সুতরাং ফিল্টারিংয়ের আগে (ক্রিয়াকলাপ শুরু) আমি একটি তালিকা ব্যাকআপ তৈরি করেছি .. (ঠিক একই তালিকাগুলি সহ অন্য একটি তালিকা)

ফিল্টারিং এ, ফিল্টার এবং তালিকাডাপ্টার প্রাথমিক তালিকার সাথে সংযুক্ত থাকে।

তবে ফিল্টার নিজেই ব্যাকআপযুক্ত তালিকা থেকে ডেটা ব্যবহার করে।

এটি আমার ক্ষেত্রে নিশ্চিত হয়েছে যে তালিকাটি তাত্ক্ষণিকভাবে আপডেট হয়েছিল এবং এমনকি অনুসন্ধান-শব্দ-অক্ষর মুছে ফেলার পরেও তালিকাটি প্রতিটি ক্ষেত্রে সফলভাবে পুনরুদ্ধার করে :)

যাইহোক এই সমাধানের জন্য ধন্যবাদ।

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