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 шт):
Вы получаете объект из нефильтрованного списка по позиции из отфильтрованного адаптера - естественно позиция съехала.
Чтобы не изобретать велосипеды можно научить адаптер работать с дата-классом вместо строки и тогда можно его (правильный дата-класс) получить из самого адаптера.
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);
....
}