ก่อนอื่นคุณต้องสร้างเค้าโครง XML ที่มีทั้ง EditText และ ListView
<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>
สิ่งนี้จะจัดวางทุกอย่างออกมาอย่างเหมาะสมพร้อมกับ EditText ด้านบน ListView ถัดไปสร้าง ListActivity ตามปกติ แต่เพิ่มการsetContentView()
โทรในonCreate()
วิธีการเพื่อให้เราใช้เค้าโครงที่ประกาศล่าสุดของเรา จำไว้ว่าเรา ID'ed เป็นพิเศษด้วย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' หรือ 'eye' คุณOnKeyListener
จะไม่ได้รับเหตุการณ์สำคัญ บางคนอาจชอบวิธีนี้ แต่ฉันคิดว่ามันน่าหงุดหงิด ฉันต้องการทุกเหตุการณ์สำคัญดังนั้นฉันจึงมีตัวเลือกในการกรองหรือไม่กรอง TextWatcher
การแก้ปัญหาคือ เพียงสร้างและเพิ่ม a 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);
}