Здесь вы идете. Простой базовый адаптер (без повторной утилизации), который будет отображать и фильтровать список некоторых произвольных суровых объектов. В этом примере Object.name - это поле, которое мы будем использовать для фильтрации.
1) В вашей деятельности (или), где вы создаете свой ListView, включите фильтрацию текста:
class MyObject {
public String name;
}
List<MyObject> myData = ArrayList<>();
listview.setTextFilterEnabled(true);
2) Как вы уже отметили, в текстовом редакторе Edittext запускайте фильтр в ListAdapter:
public void onTextChanged(CharSequence s, int start, int before, int count) {
listadapter.getFilter().filter(s);
}
3) в вашем базовом адаптере, implement Filterable
. И сохраните две копии данных, один оригинал и один отфильтрованный. Обязательно получите доступ к отфильтрованным данным по всему базовому адаптеру, а не к нефильтрованным данным
public class FilterableListAdapterExample extends BaseAdapter implements Filterable {
private List<MyObject> mData; //the original data
private List<MyObject> mDataFiltered;//the filtered data
private LayoutInflater mLayoutInflater;
public FilterableListAdapterExample(Context context, List<MyObject> data) {
mData = data;
mDataFiltered=data;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView= mLayoutInflater.inflate(R.layout.listview_item, null);
TextView textview=(TextView)convertView.findViewById(R.id.listitem_textview);
//note: we access mDataFiltered, not mData
textview.setText(mDataFiltered.get(position).name);
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
return mDataFiltered.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
//no constraint given, just return all the data. (no search)
results.count = mData.size();
results.values = mData;
} else {//do the search
List<MyObject> resultsData = new ArrayList<>();
String searchStr = constraint.toString().toUpperCase();
for (MyObject o : mData)
if (o.name.toUpperCase().startsWith(searchStr)) resultsData.add(o);
results.count = resultsData.size();
results.values = resultsData;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mDataFiltered = (ArrayList<MyObject>) results.values;
notifyDataSetChanged();
}
};
}
}
Angular выполняет обнаружение изменений в ответ на различные триггеры. События DOM, ajax-запросы и таймеры / наблюдаемые вызовут обнаружение изменений Angular.
Событие окна resize
является примером события DOM, которое инициирует обнаружение изменений.
Насколько я знаю, обнаружение изменений Angular не автоматически вызывается ResizeObserver
. Поэтому вам нужно явно указать Angular для обнаружения изменений, используя ChangeDetectorRef.detectChanges()
:
constructor(private changeDetector: ChangeDetectorRef) {}
ngAfterViewInit() {
const obs = new ResizeObserver(entries => {
// Perform updates in response to resize
// Then tell Angular to detect changes
this.changeDetector.detectChanges();
});
obs.observe(this.resizeDiv.nativeElement);
}
Вот пример StackBlitz .
Если вы заботитесь только об изменениях размеров области просмотра, нет необходимости использовать ResizeObserver
. Событие window resize
будет отлично работать во всех браузерах.