Android 具有多个RealMobject的RealmBaseAdapter

Android 具有多个RealMobject的RealmBaseAdapter,android,generics,realm,Android,Generics,Realm,我创建了两个RealMobject: 公共类HashtagObject扩展RealmObject 公共类SearchtagObject扩展了RealmObject 然后我想为两个RealmObjects使用一个适配器,我尝试使用generic添加RealmBaseAdapter,但这不正确: public class CustomListAdapter extends RealmBaseAdapter<T extends RealmObject> implements ListAd

我创建了两个RealMobject:

公共类HashtagObject扩展RealmObject

公共类SearchtagObject扩展了RealmObject

然后我想为两个RealmObjects使用一个适配器,我尝试使用generic添加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;
}}
公共类CustomListAdapter扩展RealmBaseAdapter实现ListAdapter{
私人最终订购RealmCollection mItenName;
私人活动mContext;
公共CustomListAdapter(活动上下文、OrderedRealmCollection realmResults){
super(上下文、realmResults);
this.mItenName=realmResults;
this.mContext=上下文;
}}

如何将一个适配器与多个realmobject一起使用?

您的问题是不应该为此任务创建两个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);
        }
    }
}
公共类SearchAdapter扩展了RecyclerView.Adapter{
RealmResults标签;
RealmResults搜索标签;
境界;
RealmChangeListener RealmChangeListener=新的RealmChangeListener(){
@凌驾
公共void onChange(对象元素){
notifyDataSetChanged();
}
}
公共搜索适配器(领域){
this.hashtags=realm.where(HashTagObject.class).findalsync();
this.searchtags=realm.where(SearchtagObject.class).findalsync();
this.hashtags.addChangeListener(realmChangeListener);
this.searchtags.addChangeListener(realmChangeListener);
}
私有int getResultSize(RealmResults结果){
返回((results==null)| |(!results.isValid())| |(results.isValid()&&&!results.isLoaded())?0:results.size();
}
@凌驾
public int getItemCount(){
返回1/*header*/+getResultSize(hashtags)+1/*header*/+getResultSize(searchtags);
}
静态最终整数头=0;
静态最终整数散列=1;
静态最终整数搜索=2;
@凌驾
public int getItemViewType(int位置){
if(position==0 | | position==1/*header*/+getResultSize(hashtags)){
返回头;
}
if(位置<1/*标题*/+getResultSize(hashtags)){
返回散列;
}
返回搜索;
}
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
if(viewType==标题){
返回新的HeaderViewHolder(LayoutInflater.from(parent.getContext())。膨胀(R.layout.search_header,parent,false));
}
if(viewType==散列){
返回新的HashtagViewHolder(LayoutInflater.from(parent.getContext())。膨胀(R.layout.search_hash,parent,false));
}
如果(viewType==搜索){
返回新的SearchViewHolder(LayoutInflater.from(parent.getContext())。充气(R.layout.search_search,parent,false));
}
抛出新的IllegalArgumentException(“无效视图类型[“+viewType+”]”);
}
@凌驾
public void onBindViewHolder(RecyclerView.ViewHolder abstractHolder,int位置){
if(HeaderServiceWholder的abstractHolder实例){
HeaderViewHolder=(HeaderViewHolder)抽象持有人;
如果(位置==0){
holder.setText(R.string.hash\u header\u text);
}否则{
holder.setText(R.string.search\u header\u text);
}
}else if(HashtagViewHolder的abstractHolder实例){
HashtagViewHolder=(HashtagViewHolder)abstractHolder;
HashtagObject hashObject=hashtags.get(位置-1/*头*/);
holder.bind(hashObject);
}else if(SearchViewHolder的abstractHolder实例){
SearchViewHolder=(SearchViewHolder)abstractHolder;
SearchtagObject searchObject=searchTags.get(
位置-1/*标题*/
-1/*其他标题*/
-getResultSize(hashtags)/*上一个列表*/);
持有人。绑定(搜索对象);
}
}
}

您的问题是不应该为此任务创建两个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);
        }
    }
}
公共类SearchAdapter扩展了RecyclerView.Adapter{
RealmResults标签;
RealmResults搜索标签;
境界;
RealmChangeListener RealmChangeListener=新的RealmChangeListener(){
@凌驾
公共void onChange(对象元素){
notifyDataSetChanged();
}
}
公共搜索适配器(领域){
this.hashtags=realm.where(HashTagObject.class).findalsync();
this.searchtags=realm.where(SearchtagObject.class).findalsync();
this.hashtags.addChangeListener(realmChangeListener);
this.searchtags.addChangeListener(realmChangeListener);
}
私有int getResultSize(RealmResults结果){
返回((results==null)| |(!results.isValid())| |(results.isValid()&&&!results.isLoaded())?0:results.size();
}
@凌驾
public int getItemCount(){
返回1/*header*/+getResultSize(hashtags)+1/*header*/+getResultSize(searchtags);
}
静态最终整数头=0;
静态最终整数散列=1;
静态最终整数搜索=2;
@凌驾
public int getItemViewType(int位置){
if(position==0 | | position==1/*header*/+getResultSize(hashtags)){
返回头;
}
如果(位置<1/*标题*/+getResultSize(h