0

RealmデータベースからデータをフェッチするAuotoCompleteTextview(私のMainActivity内)をセットアップしようとしています。だから私は、次のようにアダプタを使用しています:Androidレルム抽象クラスインスタンシエート

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を拡張しているので、私は混乱しています。すべてのサポートは高く評価されています。

+0

返信フック - 私は休暇にしていますので、コーディングは私の携帯電話 – EpicPandaForce

+0

:-)から地獄です..私はちょうどあなたがAndroidHiveチュートリアルを修正男ですissue..alsoイントロ例にあなたのコメントを見つけました!私はそれを感謝します..良い仕事 –

答えて

0

私はちょっと上記のコードを書き直しました。私はうまくいくはずです。

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); 
    } 
} 
+0

オハイオ州..リムチェック..私は簡単な代替が見つかりました..あなたがフィルタリングの間に新しい領域のインスタンスを作成して悪いと言った...私はMainActivityから引数として渡してみました私が何かを入力するたびに、ACTVがちらつきます。 –

+0

それはまた、レルムの変更を処理しません。だから、私がここで書いたものを実際に編集したのはこのためです。 – EpicPandaForce