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