将元素添加到顶部RealmRecyclerViewAdapter

时间:2017-06-01 09:07:20

标签: android android-recyclerview realm

我正在开发像twitter,facebook等新闻源。

我有一台服务器,可以为我提供10件文章。

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

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

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

我的想法是对id上的新文章进行排序。在这种情况下,当我向下滚动包含较小项目的项目时,ID将位于底部,当我使用SwipeRefreshLayout时,将下载并添加顶级列表中的新文章。

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

RealmRecyclerViewAdapter

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

但它不起作用,新数据已加载但未添加到顶部

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

1 个答案:

答案 0 :(得分:1)

如果您没有updated字段可以执行

findAllSortedAsync("updated", Sort.DESCENDING)

然后,您可能需要考虑添加RANK字段,并根据该字段进行排序。

例如,

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

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