android - ListView 自定义过滤器在过滤时给出错误的项目选择 [Android]

标签 android listview listview-adapter

我是 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

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

        }
    });
}

最佳答案

因为您将适配器过滤为 B.C 在位置 0 和 B.D 在位置 1。但是在您的 onClickListener 实现中,您使用 ListView 的位置直接从源 ArrayList 获取。

String a = patientArrayList.get(position);

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

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

String a = parent.getItemAtPosition(position);

关于android - ListView 自定义过滤器在过滤时给出错误的项目选择 [Android],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19926517/

相关文章:

android - 在android上一直检查互联网连接

list - 无法使用列表创建ListView.builder

android - 当我按下自定义 ListView 中存在的按钮时,它会从我想要的那一行中删除另一行

android - Kotlin - 如何执行 onCompleteListener 以从 Firestore 获取数据?

android - 如何仅向街道添加标记 - Android 开发

android - Json 数组未在 ListView 中正确显示

android ListView 适配器方法 getViewTypeCount() 在 adapter.notifyDataSetChanged() 时不触发

java - 在ListView中加载多个布局

android - 在 DatePicker 中将一周的第一天设置为星期一

c# - 如何获取 GridViewColumnHeader Click 事件上的 ListViewControl