setOnClickItem не понимает отфильтрованный список

Добавил поиск по listview через getfilter, после поиска при нажатии на любой итем открывается первый в списке до сортировки.
т.е.

список : стул стол Чайник Одеяло

вводим в поиск: стол список: стол

но при нажатии на стол откроется итем: стул

код привожу ниже. Помогите разобраться


import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;
import java.util.List;

public class ReadActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> listData;
private List<User> listTemp;
    private Query mDataBase;
    private String USER_KEY = "People";
    EditText editText;


    public void mainclick(View v) {
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
    }
    public void timeclick(View v) {
        Intent intent = new Intent(this, Times.class);
        startActivity(intent);
    }
    public void workclick(View view){
        Intent intent = new Intent(this, WorkPage.class);
        startActivity(intent);
    }
    public void contactclick(View view){
        Intent intent = new Intent(this, Contact.class);
        startActivity(intent);
    }
    public void regclick(View view){
        /*
        Intent intent = new Intent(this, reg.class);
        startActivity(intent);
*/
        Intent intent = new Intent(this, ReadActivity.class);
        startActivity(intent);
    }






    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.read_layout);
        EditText editText = findViewById(R.id.seatchtext);
        init();
        getDataFromDB();
        setOnClickItem();




        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                adapter.getFilter().filter(charSequence.toString());



            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });






    }







        public void init() {
        listView=findViewById(R.id.listview);
        listData = new ArrayList<>();
    listTemp = new ArrayList<>();
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listData);
        listView.setAdapter(adapter);
    mDataBase= FirebaseDatabase.getInstance().getReference(USER_KEY).orderByChild("fio");
}

private void getDataFromDB() {

    ValueEventListener vListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            if(listData.size() > 0) listData.clear();
            if(listTemp.size() > 0) listTemp.clear();

            for (DataSnapshot ds : snapshot.getChildren()) {
            User user = ds.getValue(User.class);
            assert user != null;
            listData.add(user.fio);
                listTemp.add(user);

            }
        adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    };
    mDataBase.addValueEventListener(vListener);
}

private void setOnClickItem() {
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            User user = listTemp.get(i);
                Intent intent = new Intent(ReadActivity.this, ShowActivity.class);
                intent.putExtra(Constant.USER_NAME,user.name);
                intent.putExtra(Constant.USER_SEC_NAME,user.sec_name);
                intent.putExtra(Constant.USER_EMAIL,user.email);
                intent.putExtra(Constant.USER_FIO,user.fio);
                intent.putExtra(Constant.USER_DOLJNOST,user.doljnost);
                intent.putExtra(Constant.USER_PHONE,user.phone);
                intent.putExtra(Constant.USER_VNPHONE,user.vnphone);
                intent.putExtra(Constant.USER_MOBILE,user.mobile);
                intent.putExtra(Constant.USER_STATUS,user.status);
                intent.putExtra(Constant.USER_OTDEL,user.otdel);
                intent.putExtra(Constant.USER_CABINET,user.cabinet);
                  startActivity(intent);
            }
        });
}






}

Ответы (1 шт):

Автор решения: woesss

Вы получаете объект из нефильтрованного списка по позиции из отфильтрованного адаптера - естественно позиция съехала.
Чтобы не изобретать велосипеды можно научить адаптер работать с дата-классом вместо строки и тогда можно его (правильный дата-класс) получить из самого адаптера.

private ArrayAdapter<User> adapter;
....
    adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, listTemp);

Класс User учим превращаться в нужный текст, для чего добавляем в него такой метод:

    @Override
    public String toString() {
        return fio;
    }

И так получаем объект из адаптера:

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        User user = (User) adapterView.getItemAtPosition(i);
        ....
    }
→ Ссылка