0

(내 MainActivity에서) 영역 데이터베이스에서 데이터를 가져 오는 AuotoCompleteTextview를 설정하려고합니다. 그래서 다음과 같은 어댑터를 사용하고 있습니다 :안드로이드 영역 추상 클래스 인스턴스화

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

관련 문제