2016-10-18 1 views
1

Я создал два RealmObjects:RealmBaseAdapter с несколькими RealmObjects

общественного класса HashtagObject распространяется RealmObject

общественного класса SearchtagObject расширяет RealmObject

Затем я хочу использовать один адаптер для двух RealmObjects, я попробуйте добавить RealmBaseAdapter с общим, но это неверно:

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; 
}} 

Как использовать один адаптер с несколькими объектами RealmObjects?

+1

Это полностью зависит от того, как вы собираетесь показать две совершенно разные RealmObjects в том же 'ListView', учитывая AFAIK Realm [не поддерживает общие RealmObjects] (https://github.com/realm/realm- java/issues/2265), и в настоящее время вы предоставляете только набор ** адаптера ** **, который может принадлежать только ** одному ** RealmObject. – EpicPandaForce

+0

В вашем случае решение наиболее определенно состоит в том, что эти два объекта RealmObject должны быть одним объектом RealmObject. – EpicPandaForce

+0

Мои объекты RealmObject отличаются только одной переменной, поэтому не стоит использовать адаптер onne. Но если я не могу использовать RealmBaseAdapter с общим я имею только один способ использования двух адаптеров? Я полагаю, что это не так хорошо. – Delphian

ответ

3

Ваша проблема в том, что вы не должны создавать два объекта RealmObject для этой задачи. Вы должны создать один объект RealmObject.

public class HashtagObject extends RealmObject 

public class SearchtagObject extends RealmObject 

Они должны быть

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

Если вам все еще нужно, чтобы показать их отдельно, то вам нужно два результата, в этом случае вам обязательно нужно свой собственный адаптер.

Для этого я бы рекомендовал несколько отразить то, что делает RealmRecyclerViewAdapter.

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

Спасибо за помощь. Но если у меня есть два объекта, которые не связаны друг с другом с разными полями? HashtagObject имеет поле hashtag, а SearchtagObject имеет поля широты и долготы. Я создаю TagObject с тремя полями. И тогда мне нужно найти все HashtagObject в TagObject У меня есть только поле hashtag, но поля широты и долготы будут пустыми? Как я понимаю, @Index помогает мне в поиске, но у меня есть только один объект с большим количеством пустых полей? – Delphian

+0

Довольно много. не невозможно показать оба типа, вам просто нужно написать свой адаптер вместо «RealmBaseAdapter». Это зависит от вашего дизайна - вы должны показывать их все в одном списке или отделены друг от друга? – EpicPandaForce

+0

Мне нужно показать их отдельно друг от друга. Сначала я думаю, что создать два адаптера - это простой способ и очень быстро. Но если у меня будет три или более RealmObjects, они не свяжутся друг с другом, это будет очень плохое решение. Другой способ я могу использовать ArrayAdapter и конструктор типа: 'public CustomListAdapter (контекст активности, ArrayList hashtag, ArrayList широта, ArrayList longtitude и т. Д.)' И перевести все объекты RealmObjects в String. Но это не хорошо для выступления. – Delphian

Смежные вопросы