ViewContainerRef с ResizeObserver не работает должным образом в угловых

Здесь вы идете. Простой базовый адаптер (без повторной утилизации), который будет отображать и фильтровать список некоторых произвольных суровых объектов. В этом примере 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();
        }
    };
}

}

0
задан Manish Singh 7 March 2019 в 03:20
поделиться

1 ответ

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 будет отлично работать во всех браузерах.

0
ответ дан Alex K 7 March 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: