প্রথমত, আপনাকে একটি এক্সএমএল লেআউট তৈরি করতে হবে যা এডিট টেক্সট এবং একটি তালিকাভিউ উভয়ই রাখে।
<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);
}