Android 将元素添加到顶级RealmRecyclServiceAdapter

Android 将元素添加到顶级RealmRecyclServiceAdapter,android,android-recyclerview,realm,Android,Android Recyclerview,Realm,我正在开发twitter、facebook等新闻源 我有一个服务器,它为我提供10篇文章的部分内容 当我向下滚动时,新文章被加载、添加到数据库并显示在RealmRecyclerView中 我添加了SwipeRefreshLayout来更新数据(在新的引号出现的情况下) 使用SwipeRefreshLayout时,在顶部添加新项目时遇到问题 我的想法是根据id对新文章进行排序。在这种情况下,当我向下滚动具有较小id的项目时,id将位于底部,当我使用swiperFreshLayout时,具有较高id

我正在开发twitter、facebook等新闻源

我有一个服务器,它为我提供10篇文章的部分内容

当我向下滚动时,新文章被加载、添加到数据库并显示在
RealmRecyclerView

我添加了
SwipeRefreshLayout
来更新数据(在新的引号出现的情况下)

使用
SwipeRefreshLayout
时,在顶部添加新项目时遇到问题

我的想法是根据id对新文章进行排序。在这种情况下,当我向下滚动具有较小id的项目时,id将位于底部,当我使用
swiperFreshLayout
时,具有较高id的新文章将下载并添加到顶部列表中

MyFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_view_all_quotes, container, false);
    swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
    swipeRefreshLayout.setOnRefreshListener(this);
    Realm.init(getActivity());
    realm = Realm.getDefaultInstance();
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new QuoteAdapter(realm.where(QuoteObject.class).findAllSortedAsync("id", Sort.DESCENDING), getActivity());
    recyclerView.setAdapter(adapter);
    return view;
}


  @Override
public void onRefresh() {
    int position = realm.where(QuoteObject.class).findAll().size();
    DownloadDataFromServer.DownloadQuotes downloadQuotes =
            new DownloadDataFromServer.DownloadQuotes();
    try {
        DownloadDataFromServer.DownloadQuotes.FlagQuotes = true;
        downloadQuotes.execute(position+1).get();
    }catch (Exception e){
        Log.e(TAG, "Error", e);
    }finally {
        swipeRefreshLayout.setRefreshing(false);
    }
}
RealmRecyclServiceAdapter

class QuoteAdapter extends RealmRecyclerViewAdapter<QuoteObject, QuoteAdapter.AllQuotesViewHolder> {

 QuoteAdapter(OrderedRealmCollection<QuoteObject> quotes, Context context) {
    super(quotes, true);
    this.context = context;
    if (quotes.size() == 0) downloadData(0);
}

.
.
.
 @Override
public void onBindViewHolder(final QuoteAdapter.AllQuotesViewHolder viewHolder, int position) {
    if (position == getData().size() - 1) downloadData(position);
....
}
class QuoteAdapter扩展了realmRecyclServiceAdapter{
QuoteAdapter(OrderedRealmCollection引号,上下文){
超级(引用,真实);
this.context=上下文;
如果(quotes.size()==0)下载数据(0);
}
.
.
.
@凌驾
BindViewHolder上的公共无效(最终QuoteDapter.AllQuotesViewHolder视图持有人,内部位置){
if(position==getData().size()-1)下载数据(position);
....
}
但它不起作用,新数据已加载但未添加到顶部

因为我是第一次这样做,也许我没有选择正确的方法。
如果您这样做了,请说明如何正确创建新闻提要。

如果您没有更新的字段,则可以通过该字段执行此操作

findAllSortedAsync("updated", Sort.DESCENDING)

您可能需要考虑添加<代码> Reals字段,并基于此进行排序。

比如说,

// when downloading new items by "SwipeToRefresh" from top
        // inside Realm transaction
                RealmResults<FeedItem> feedItems = dao.findAll(realm);
                for(int i = feedItems.size() - 1; i >= 0; i--) {
                    FeedItem feedItem = feedItems.get(i);
                    feedItem.setRank(feedItem.getRank() + response.size());
                }
                long rank = 1;
                FeedItem defaultInstance = new FeedItem();
                for(FeedItemDTO dto : response) {
                    FeedItem realmObject = mapper.toRealmObject(realm, dto, defaultInstance);
                    realmObject.setRank(rank++);
                    dao.insertOrUpdate(realm, realmObject);
                }

public-FeedItem-toRealmObject(领域领域领域,FeedItemDTO-dto,feeditempinterface-defaultInstance){
if(defaultInstance==null){
defaultInstance=新的FeedItem();
}
setId(dto.getId());
RealmList CategoryId=新的RealmList();
if(dto.getCategoryIds()!=null){
for(长categoryId:dto.getCategoryId()){
FeedCategory FeedCategory=feedCategoryRepository.findOne(领域,类别ID);
如果(feedCategory!=null){
添加(饲料类别);
}
}
}
setCategoryIds(categoryIds);
setCreatedTime(新日期(dto.getCreatedTime());
defaultInstance.setUpdatedTime(新日期(dto.getUpdatedTime());
setTitle(dto.getTitle());
defaultInstance.setShortDescription(dto.getShortDescription());
defaultInstance.setNumberOfLikes(dto.getNumberOfLikes());
setIsLiked(dto.getIsLiked());
setIsFavorited(dto.getIsFavorited());
defaultInstance.setIsImportant(dto.getIsImportant());
setImageUrl(dto.getImageUrl());
setTypeCode(dto.getTypeCode());
defaultInstance.setResultTypeCode(dto.getResultTypeCode());
返回默认实例;
}

他们没有“更新”日期字段之类的时间戳吗?就我个人而言,我刚刚做了
findAllSortedAsync(“更新”,排序。降序)
并且成功了。您可以演示一下如何再次将新数据更新到适配器吗?可能您需要正确使用notifyItemRangeChanged或notifyItemMoved方法。@susheeltickoo
RealmRecycleServiceAdapter
根据
OrderedRealmCollectionChangeSet
@EpicPandaForce引号不会自动处理所有notifyItem*调用有一个日期字段。我添加了你的代码,但它没有改变任何东西。引用已加载,但没有显示。dao是什么?我了解多少,在这段代码中,你改变了域本身内元素的顺序?为什么我不能改变id上元素的顺序?如果你下载数据并将其插入域中,那么它将自动不定期更新适配器,因为RealmResults被提供给RealmRecyclServiceAdapter(它添加了处理此问题的右侧
OrderedRealmCollectionChangeListener
)。因此,如果您的新项目未按ID排序,则表示您的ID未按您希望的顺序排序。---我更改了域中的顺序,因为它也会更新排序结果。请您给出一个实现映射器的示例。这是一个映射器。我不明白我为什么需要映射器,以及db如何理解可能我没有解释我想要什么,或者你不理解我。如果你有时间,请看我在githab中的代码
// when download new items by scrolling to bottom
        // inside Realm transaction
                long count = dao.count(realm);
                long rank = count + 1;
                FeedItem defaultInstance = new FeedItem();
                for(FeedItemDTO dto : response) {
                    FeedItem realmObject = mapper.toRealmObject(realm, dto, defaultInstance);
                    realmObject.setRank(rank++);
                    dao.insertOrUpdate(realm, realmObject);
                }
public FeedItem toRealmObject(Realm realm, FeedItemDTO dto, FeedItemInterface defaultInstance) {
    if(defaultInstance == null) {
        defaultInstance = new FeedItem();
    }
    defaultInstance.setId(dto.getId());
    RealmList<FeedCategory> categoryIds = new RealmList<FeedCategory>();
    if(dto.getCategoryIds() != null) {
        for(Long categoryId : dto.getCategoryIds()) {
            FeedCategory feedCategory = feedCategoryRepository.findOne(realm, categoryId);
            if(feedCategory != null) {
                categoryIds.add(feedCategory);
            }
        }
    }
    defaultInstance.setCategoryIds(categoryIds);
    defaultInstance.setCreatedTime(new Date(dto.getCreatedTime()));
    defaultInstance.setUpdatedTime(new Date(dto.getUpdatedTime()));
    defaultInstance.setTitle(dto.getTitle());
    defaultInstance.setShortDescription(dto.getShortDescription());
    defaultInstance.setNumberOfLikes(dto.getNumberOfLikes());
    defaultInstance.setIsLiked(dto.getIsLiked());
    defaultInstance.setIsFavorited(dto.getIsFavorited());
    defaultInstance.setIsImportant(dto.getIsImportant());
    defaultInstance.setImageUrl(dto.getImageUrl());
    defaultInstance.setTypeCode(dto.getTypeCode());
    defaultInstance.setResultTypeCode(dto.getResultTypeCode());
    return defaultInstance;
}