ListView自定义过滤器在过滤时选择了错误的项目[Android]

前端之家收集整理的这篇文章主要介绍了ListView自定义过滤器在过滤时选择了错误的项目[Android]前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Android编程新手,我有一个ListView,当过滤总是返回列表中的第一项,所以我该如何解决这个问题?

例如,我的清单包含A.A,A.B,A.C,B.C,B.D.
当我想在列表中搜索以B开头的内容时,我会得到B.C,B.D但是当我点击B.C时,它返回给我A.A和B.D,它返回给我A.B

  1. public class PatientList extends Activity{
  2.  
  3. PatientDB patientDB;
  4. Context myContext;
  5. ListView lv_patients;
  6. EditText et_patients;
  7. ArrayAdapter<String> adapter;
  8. ArrayList<HashMap<String,String>> patientList;
  9. static String value;
  10. String[] patientarray = new String[]{"initials"};
  11. ArrayList<String> patientArrayList = new ArrayList<String>();
  12.  
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. // TODO Auto-generated method stub
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_patient_list);
  18.  
  19. myContext = this;
  20. patientDB = new PatientDB(myContext);
  21. patientDB.open();
  22.  
  23. Cursor patientCursor;
  24.  
  25. patientCursor = patientDB.retrieveAllEntriesCursor();
  26.  
  27. if(patientCursor!=null && patientCursor.getCount()>0)
  28. {
  29. String patientInitials;
  30.  
  31. patientCursor.moveToFirst();
  32. do
  33. {
  34. patientCursor.getString(patientDB.COLUMN_KEY_ID); // + " " +
  35. patientInitials = patientCursor.getString(patientDB.COLUMN_INITIALS_ID);
  36. Log.i("FromCursor",patientInitials);
  37. patientArrayList.add(patientInitials);
  38. } while (patientCursor.moveToNext());
  39. }
  40.  
  41. lv_patients = (ListView) findViewById(R.id.lv_patients);
  42. et_patients = (EditText) findViewById(R.id.et_patients);
  43.  
  44. lv_patients.setOnItemClickListener(new OnItemClickListener() {
  45.  
  46. public void onItemClick(AdapterView<?> parent,View view,int position,long id) {
  47. // TODO Auto-generated method stub
  48. String a = patientArrayList.get(position);
  49. Toast.makeText(PatientList.this,a + " selected",Toast.LENGTH_SHORT).show();
  50. Intent returnIntent = new Intent(PatientList.this,PatientInfo.class);
  51. returnIntent.putExtra("value",a);
  52. setResult(RESULT_OK,returnIntent);
  53. finish();
  54. }
  55. });
  56.  
  57. //Adding items to listview
  58. adapter = new ArrayAdapter<String>(this,R.layout.list_patients,R.id.patient_name,patientArrayList);
  59. lv_patients.setAdapter(adapter);
  60.  
  61. //Enabling search filter
  62. et_patients.addTextChangedListener(new TextWatcher() {
  63.  
  64. public void onTextChanged(CharSequence cs,int arg1,int arg2,int arg3) {
  65. // When user changed the Text
  66. PatientList.this.adapter.getFilter().filter(cs);
  67. }
  68.  
  69. public void beforeTextChanged(CharSequence arg0,int arg3) {
  70. // TODO Auto-generated method stub
  71.  
  72. }
  73.  
  74. public void afterTextChanged(Editable arg0) {
  75. // TODO Auto-generated method stub
  76.  
  77. }
  78. });
  79. }

}

解决方法

因为您过滤适配器使位置0中的B.C和位置1中的B.D.但是在onClickListener的实现中,您使用listview的位置直接从源ArrayList获取.
  1. String a = patientArrayList.get(position);

而是从过滤的适配器获取它:

  1. String a = parent.getAdapter().getItem(position);

要么

  1. String a = parent.getItemAtPosition(position);

猜你在找的Android相关文章