Обновление списка listview после удаления символов из строки поиска
Добавил несколько пунктов listview из массива строк и пришпандорил простенький поиск по элементам. При этом при каждом новом символе список обновляется. Это все круто, но хотелось, чтобы при удалении символов, список также обновлялся и соответственно плавно снова увеличивался. Но этого почему-то не происходит.
MainActivity
package com.example.arseny.songbook;
import ...
public class MainActivity extends AppCompatActivity {
String[] items;
ArrayList<String> listItems;
ArrayAdapter<String> adapter;
ListView listView;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(ListView)findViewById(R.id.listView);
editText=(EditText)findViewById(R.id.txtsearch);
initList();
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.toString().equals("")){
initList();
} else {
searchItem(s.toString());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch(id){
case R.id.action_settings :
Intent intent = new Intent();
intent.setClass(MainActivity.this, com.example.arseny.songbook.Activity_Three.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
public void searchItem(String textToSearch){
for(String item:items){
String textToSearch1 = textToSearch.toLowerCase();
if(!item.toLowerCase().contains(textToSearch1)){
listItems.remove(item);
}
}
adapter.notifyDataSetChanged();
}
public void initList() {
items = new String[]{"...", "...", "..."};
listItems = new ArrayList<>(Arrays.asList(items));
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.txtitem, listItems);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String itemValue = (String) listView.getItemAtPosition(position);
Intent intent = new Intent();
intent.setClass(MainActivity.this, com.example.arseny.songbook.Activity_Two.class);
intent.putExtra("names", itemValue);
startActivity(intent);
}
});
}
}
Ответы (2 шт):
Автор решения: ЮрийСПб
→ Ссылка
Можно по разному. Например так:
- Храните 2 списка элементов полный и тот, который отображаете.
- При поиске очищайте 2 список и наполняйте его согласно алгоритму соответствия
- Для отображения в адаптере используйте 2 список.
Так у вас будет нужное вам поведение.
Автор решения: Maks
→ Ссылка
Если вы ищете событие при котором обновлять список то попробуйте onTextChanged:
edittext.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s.length() > 0)
{ //do your work here }
}
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void afterTextChanged(Editable s) {
}
});