2013-11-12 3 views
6

Я новичок в программировании на Android, и у меня есть ListView при фильтрации, всегда возвращаю мне первый элемент в списке, так как я могу исправить это?Пользовательский фильтр ListView дает неправильный элемент, выбранный при фильтрации [Android]

Например, мой список содержит A.A, A.B, A.C, B.C, B.D. Когда я хочу найти список для вещей, начиная с B, я доберусь до н.э., BD, но когда я нажимаю до н.э., он возвращает меня АА и BD, он возвращает мне AB

public class PatientList extends Activity{ 

PatientDB patientDB; 
Context myContext; 
ListView lv_patients;  
EditText et_patients; 
ArrayAdapter<String> adapter; 
ArrayList<HashMap<String, String>> patientList; 
static String value; 
String[] patientarray = new String[]{"initials"}; 
ArrayList<String> patientArrayList = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_patient_list); 

    myContext = this; 
    patientDB = new PatientDB(myContext); 
    patientDB.open(); 

    Cursor patientCursor; 

    patientCursor = patientDB.retrieveAllEntriesCursor(); 

    if(patientCursor!=null && patientCursor.getCount()>0) 
    { 
     String patientInitials; 

     patientCursor.moveToFirst(); 
     do 
     { 
      patientCursor.getString(patientDB.COLUMN_KEY_ID); // + " " + 
      patientInitials = patientCursor.getString(patientDB.COLUMN_INITIALS_ID); 
      Log.i("FromCursor", patientInitials); 
      patientArrayList.add(patientInitials); 
     } while (patientCursor.moveToNext()); 
    } 

    lv_patients = (ListView) findViewById(R.id.lv_patients); 
    et_patients = (EditText) findViewById(R.id.et_patients); 

    lv_patients.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // TODO Auto-generated method stub 
      String a = patientArrayList.get(position); 
      Toast.makeText(PatientList.this, a + " selected", Toast.LENGTH_SHORT).show();    
      Intent returnIntent = new Intent(PatientList.this, PatientInfo.class); 
      returnIntent.putExtra("value", a); 
      setResult(RESULT_OK, returnIntent); 
      finish(); 
     } 
    }); 

    //Adding items to listview 
    adapter = new ArrayAdapter<String>(this, R.layout.list_patients, R.id.patient_name, patientArrayList); 
    lv_patients.setAdapter(adapter); 

    //Enabling search filter 
    et_patients.addTextChangedListener(new TextWatcher() { 

     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      PatientList.this.adapter.getFilter().filter(cs); 
     } 

     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
      // TODO Auto-generated method stub 

     } 

     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 

     } 
    }); 
} 

}

+0

http://stackoverflow.com/a/29072140/3717188 –

ответ

15

Поскольку вы фильтруете ваш адаптер, чтобы иметь BC в позиции 0 и BD в позиции 1. Но в вашей реализации вашего onClickListener вы используете позицию listview для непосредственного получения из исходного ArrayList.

String a = patientArrayList.get(position); 

вместо того, чтобы получить его из отфильтрованного адаптера:

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

или

String a = parent.getItemAtPosition(position); 
+0

Я пытаюсь сделать что-то аналогично, пожалуйста, проверьте приведенную ниже ссылку для моего кода. http://pastebin.com/8vjJJnvh –

+0

Если объект «cust» совпадает с тем, что находится в адаптере, вы должны быть в порядке. В противном случае я хотел бы ссылаться на структуру данных адаптера, используя метод, описанный в этом решении. – frogmanx

+1

Отличный ответ. продолжайте делать хорошую работу – VVB

Смежные вопросы