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

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

问题描述

我试图在我的MainActivity中设置一个AuotoCompleteTextview,从Realm数据库中获取数据。因此,我使用的适配器如下:

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天全站免登陆