Таким образом, у меня есть базовое пользовательское listview с изображением и текстом для каждого элемента списка, и мне было интересно, как я буду фильтровать через listview динамически с помощью окна edittext. Я посмотрел, как это сделать, но я застрял в одном месте, где я не уверен, что делать.Фильтровать список просмотров с помощью настраиваемого макета?
My listview заполнен из sqlitedatabase, где у меня есть методы, которые извлекают все имена изображений, текст и идентификаторы из базы данных и помещают их в список. Вот мой код до сих пор, где я не совсем уверен, что я должен делать в методе
public class MainActivity extends Activity {
ListView data;
EditText inputSearch;
ArrayList<String> names, images, ids;
ArrayAdapter<String> adapter;
MyDatabase helper;
ImageView sprite;
TextView name, id;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data = (ListView) findViewById(R.id.listView1);
helper = new MyDatabase(this);
helper.openDataBase();
names = helper.getNameList();
images = helper.getImageList();
ids = helper.getIdList();
adapter = new MyArrayAdapter(this);
data.setAdapter(adapter);
inputSearch = (EditText) findViewById(R.id.edit_search);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
}
private class MyArrayAdapter extends ArrayAdapter<String>{
public MyArrayAdapter(Context c) {
super(c, R.layout.item_view,names);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (convertView == null){
row = getLayoutInflater().inflate(R.layout.item_view, parent,false);
}
sprite = (ImageView) row.findViewById(R.id.sprite);
name = (TextView) row.findViewById(R.id.name);
id = (TextView) row.findViewById(R.id.ids);
name.setText(names.get(position).toString());
int resID = getResources().getIdentifier(images.get(position),"drawable", getPackageName());
sprite.setImageResource(resID);
id.setText(ids.get(position).toString());
return row;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return new Filter(){
@Override
protected FilterResults performFiltering(CharSequence input) {
FilterResults results = new FilterResults();
int originalLength = names.size();
if (input == null || input.length() == 0){
results.values = names;
results.count = originalLength;
} else {
ArrayList<String> newList = new ArrayList<String>();
for (int i = 0; i < originalLength; i++){
String str = names.get(i);
if (str.toLowerCase(Locale.getDefault()).contains(input))
newList.add(str);
results.values = newList;
results.count = newList.size();
}
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence,
FilterResults results) {
//Not sure what to do here
notifyDataSetChanged();
}
};
}
}
что половина исправляет это. Как мне отображать изображения, которые также фильтруются, так как вышеупомянутый код только фильтрует текст, а не изображения. Также мне нужно будет сделать еще одну копию моего массива имен, поскольку, если я просто очистите(), то addAll() до моего имени массив, я потеряю все свои исходные данные. – slim1801
Сделано редактирование с более конкретной прогулкой по – Submersed
»(ArrayList) results.values« Это, кажется, дает мне ошибку. Я следил за контуром вашего метода, однако, когда я запускаю свое приложение, когда я ввожу символ в блок edittext, он выходит из строя и не дает мне такой ошибки метода. –
slim1801