2016-10-18 2 views
1

Ich habe zwei RealmObjects:RealmBaseAdapter mit mehreren RealmObjects

public class HashtagObject RealmObject erweitert

public class SearchtagObject erweitert RealmObject

Dann habe ich einen Adapter für zwei RealmObjects verwenden möchten, ich Versuchen Sie RealmBaseAdapter mit generischen hinzuzufügen, aber es ist nicht korrekt:

public class CustomListAdapter extends RealmBaseAdapter<T extends RealmObject> implements ListAdapter{ 

private final OrderedRealmCollection<T> mItenName; 
private Activity mContext; 

public CustomListAdapter(Activity context, OrderedRealmCollection<T> realmResults){ 
    super(context, realmResults); 
    this.mItenName=realmResults; 
    this.mContext= context; 
}} 

Wie verwende ich einen Adapter mit mehreren RealmObjects?

+1

Die völlig hängt davon ab, wie Sie beabsichtigen, zwei völlig verschiedene RealmObjects im gleichen 'ListView' zu zeigen, afaik Realm unter Berücksichtigung [unterstützt keine generischen RealmObjects] (https://github.com/realm/realm- java/issues/2265), und derzeit geben Sie dem Adapter nur einen ** Ergebnissatz, der nur zu ** einem ** RealmObject gehören kann. – EpicPandaForce

+0

In Ihrem Fall ist die Lösung definitiv, dass diese beiden RealmObjects ein RealmObject sein sollten. – EpicPandaForce

+0

Meine RealmObjects unterscheiden nur eine Variable, deshalb ist es kein Problem, den Onne Adapter zu benutzen. Aber wenn ich RealmBaseAdapter nicht mit generischen verwenden kann, habe ich nur eine Möglichkeit mit zwei Adaptern? Ich nehme an, es ist nicht so gut Weg – Delphian

Antwort

3

Ihr Problem ist, dass Sie nicht zwei RealmObjects für diese Aufgabe erstellen sollten. Sie sollten ein RealmObject erstellen.

public class HashtagObject extends RealmObject 

public class SearchtagObject extends RealmObject 

sollten diese

public class TagObject extends RealmObject { 
    @Index 
    private String type; //HASHTAG or SEARCHTAG 

sein Wenn Sie noch gesondert zeigen müssen, dann werden Sie zwei Ergebnisse benötigen, in diesem Fall sind Sie auf jeden Fall Ihren kundenspezifischen Adapter benötigen.

Dafür würde ich etwas Spiegelung empfehlen, was RealmRecyclerViewAdapter tut.

public class SearchAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    RealmResults<HashtagObject> hashtags; 
    RealmResults<SearchtagObject> searchtags; 

    Realm realm; 

    RealmChangeListener realmChangeListener = new RealmChangeListener() { 
     @Override 
     public void onChange(Object element) { 
      notifyDataSetChanged(); 
     } 
    } 

    public SearchAdapter(Realm realm) { 
     this.hashtags = realm.where(HashTagObject.class).findAllAsync(); 
     this.searchtags = realm.where(SearchtagObject.class).findAllAsync(); 

     this.hashtags.addChangeListener(realmChangeListener); 
     this.searchtags.addChangeListener(realmChangeListener); 
    } 

    private <T extends RealmModel> int getResultSize(RealmResults<T> results) { 
     return ((results == null) || (!results.isValid()) || (results.isValid() && !results.isLoaded()) ? 0 : results.size(); 
    } 

    @Override 
    public int getItemCount() { 
     return 1 /* header */ + getResultSize(hashtags) + 1 /* header */ + getResultSize(searchtags); 
    } 

    static final int HEADER = 0; 
    static final int HASH = 1; 
    static final int SEARCH = 2; 

    @Override 
    public int getItemViewType(int position) { 
     if(position == 0 || position == 1 /*header*/ + getResultSize(hashtags)) { 
      return HEADER; 
     } 
     if(position < 1 /*header*/ + getResultSize(hashtags)) { 
      return HASH; 
     } 
     return SEARCH; 
    } 

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(viewType == HEADER) { 
      return new HeaderViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.search_header, parent, false)); 
     } 
     if(viewType == HASH) { 
      return new HashtagViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.search_hash, parent, false)); 
     } 
     if(viewType == SEARCH) { 
      return new SearchViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.search_search, parent, false)); 
     } 
     throw new IllegalArgumentException("Invalid view type [" + viewType + "]"); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder abstractHolder, int position) { 
     if(abstractHolder instanceof HeaderViewHolder) { 
      HeaderViewHolder holder = (HeaderViewHolder) abstractHolder; 
      if(position == 0) { 
       holder.setText(R.string.hash_header_text); 
      } else { 
       holder.setText(R.string.search_header_text); 
      } 
     } else if(abstractHolder instanceof HashtagViewHolder) { 
      HashtagViewHolder holder = (HashtagViewHolder) abstractHolder; 
      HashtagObject hashObject = hashtags.get(position - 1 /*header*/); 
      holder.bind(hashObject); 
     } else if(abstractHolder instanceof SearchViewHolder) { 
      SearchViewHolder holder = (SearchViewHolder)abstractHolder; 
      SearchtagObject searchObject = searchTags.get(
       position - 1 /* header */ 
          - 1 /* other header */ 
          - getResultSize(hashtags) /* previous list */); 
      holder.bind(searchObject); 
     } 
    } 
} 
+0

Danke für die Hilfe, aber wenn ich zwei Objekte habe, die nicht miteinander mit verschiedenen Feldern verbunden sind HashtagObject hat Hashtagfeld und SearchtagObject hat Breite und Longitude Felder Ich erstelle TagObject mit drei Feldern Und dann muss ich alle HashtagObject in TagObject finden Ich habe nur Hashtag Feld, aber Breite und Länge Felder werden Null? Wie ich verstehe @ Index hilft mir bei der Suche, aber ich habe nur ein Objekt mit vielen leeren Feldern? – Delphian

+0

Ziemlich viel.Ob technisch ist es Nicht unmöglich, beide Typen zu zeigen, du musst nur deinen Adapter anstelle von 'RealmBaseAdapter' schreiben. Es kommt auf Ihr Design an - sollen Sie sie alle in einer Liste oder getrennt voneinander zeigen? – EpicPandaForce

+0

Ich muss sie von einem zum anderen getrennt zeigen. Zuerst denke ich, zwei Adapter zu erstellen, ist einfach und sehr schnell. Aber wenn ich drei oder mehr RealmObjects habe, die nicht miteinander verlinkt sind, ist das eine sehr schlechte Entscheidung. Eine andere Möglichkeit kann ArrayAdapter und Konstruktor wie: 'public CustomListAdapter (Aktivitätskontext, ArrayList Hashtag, ArrayList Breitengrad, ArrayList Längengrad etc') Und alle RealmObjects in String übersetzen. Aber es ist nicht gut für die Leistung. – Delphian