Android Realm 抽象类实例化 [英] Android Realm Abstract Class Instantiate

查看:29
本文介绍了Android Realm 抽象类实例化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试设置从 Realm 数据库获取数据的 AuotoCompleteTextview(在我的 MainActivity 中).所以我使用的适配器如下:

I am trying to setup an AuotoCompleteTextview (in my MainActivity) where data is fetched from Realm database. So I'm using an adapter as following:

public abstract class FilterableRealmBaseAdapter<T extends RealmObject> extends ArrayAdapter<T> implements Filterable {

private final RealmResults<T> mRealmObjectList;
private List<T> mResults;

public FilterableRealmBaseAdapter(Context context, @LayoutRes int layout, RealmResults<T> realmObjectList) {
    super(context, layout);
    mRealmObjectList = realmObjectList;
}

@Override
public int getCount() {
    return mResults == null ? 0 : mResults.size();
}

@Override
public T getItem(int position) {
    return mResults == null ? null : mResults.get(position);
}

@Override
public Filter getFilter() {

    return new Filter() {
        private boolean mHasResults = false;

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // do nothing here because it's executed in another thread and Realm really
            // doesn't like treating data from another thread.
            final FilterResults results = new FilterResults();
            results.count = mHasResults ? 1 : 0; // AutoCompleteTextView already hides dropdown here if count is 0, so correct it.
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            // back on the main thread, we can do the query and notify
            if (constraint != null) {
                mResults = performRealmFiltering(constraint, mRealmObjectList);
                mHasResults = mResults.size() > 0;
                notifyDataSetChanged();
            }
        }
    };
}

protected abstract List<T> performRealmFiltering(@NonNull CharSequence constraint, RealmResults<T> results);
}

如何使用它在我的 MainActivity 中设置适配器?我猜它是通过扩展它并覆盖抽象方法来完成的.但是我的 MainActivity 已经扩展了 AppCompatActivity 并且适配器类已经扩展了 ArrayAdapter,所以我很困惑.感谢所有支持.

How can I use this to set the adapter in my MainActivity? I guess its done by extending it and overriding the abstract method. But my MainActivity already extends AppCompatActivity and adapter class already extends ArrayAdapter, so I'm confused. All support are appreciated.

推荐答案

我有点重写了上面的代码,我认为它应该可以工作.

I kinda rewrote the code above and I think it should work.

public abstract class FilterableRealmBaseAdapter<T extends RealmModel> extends ArrayAdapter<T> implements Filterable {

    private RealmResults<T> results;

    private final RealmChangeListener realmChangeListener;

    public FilterableRealmBaseAdapter(Context context, @LayoutRes int layout, @Nullable RealmResults<T> initialResults) {
        super(context, layout);
        this.realmChangeListener = new RealmChangeListener() {
            @Override
            public void onChange(Object element) {
                notifyDataSetChanged();
            }
        };
        this.results = initialResults;
        if(results != null && results.isValid()) {
            results.addChangeListener(realmChangeListener);
        }
    }

    @Override
    public int getCount() {
        return results == null || !results.isValid() ? 0 : results.size();
    }

    @Override
    public T getItem(int position) {
        return results == null || !results.isValid() ? null : results.get(position);
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                return new FilterResults();
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                if (constraint != null) {
                    if(this.results != null && this.results.isValid()) {
                        results.removeChangeListeners();
                    }
                    this.results = executeRealmQuery(constraint);
                    results.addChangeListener(realmChangeListener);
                    notifyDataSetChanged();
                }
            }
        };
    }

    protected abstract RealmResults<T> executeRealmQuery(@NonNull CharSequence constraint);
}

public class SomethingRealmAdapter extends FilterableRealmBaseAdapter<Something> {
    private final Realm realm;

    public SomethingRealmAdapter(Context context, @LayoutRes int layout, @Nullable RealmResults<Something> results, Realm realm) {
        super(context, layout, results);
        this.realm = realm;
    }

    protected RealmResults<T> executeRealmQuery(@NonNull CharSequence constraint) {
        return realm.where(Something.class)
                    .contains(SomethingFields.NAME, constraint.toString(), Case.INSENSITIVE)
                    .findAllSorted(SomethingFields.NAME, Sort.ASCENDING);
    }
}

这篇关于Android Realm 抽象类实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆