GeekNews
GeekNews copied to clipboard
likeFragment中onMove方法存在bug
public boolean onMove(int srcPosition, int targetPosition) {
if (mList != null) {
// 更换数据库中的数据Item的位置
boolean isPlus = srcPosition < targetPosition;
mPresenter.changeLikeTime(mList.get(srcPosition).getId(),mList.get(targetPosition).getTime(),isPlus);
// 更换数据源中的数据Item的位置
Collections.swap(mList, srcPosition, targetPosition);
// 更新UI中的Item的位置,主要是给用户看到交互效果
mAdapter.notifyItemMoved(srcPosition, targetPosition);
return true;
}
return false;
}
交换两个item后时间做+1,-1操作。如下:
@Override
public void changeLikeTime(String id ,long time, boolean isPlus) {
RealmLikeBean bean = mRealm.where(RealmLikeBean.class).equalTo("id", id).findFirst();
mRealm.beginTransaction();
if (isPlus) {
bean.setTime(++time);
} else {
bean.setTime(--time);
}
mRealm.commitTransaction();
}
这种方式存在的问题是: 当list中的item多于2个时,通过某种交换方式,会使得至少2个item的时间相同。关闭app,再次打开时候like_list中的顺序可能会关闭app时 的顺序不用。
ITEM-A | 100 | | ITEM-A | 100 | | ITEM-C | 300
ITEM-B | 200 | B和C交换-》》 | ITEM-C | 300 | A和C交换 -》》 | ITEM-A | 301
ITEM-C | 300 | | ITEM-B | 301 | | ITEM-B | 301
直接交换 两个item的时间不会存在上诉问题。
使用下面方法没有问题。
@Override
public void changeLikeTime(String srcId, String targetId) {
RealmLikeBean srcBean = mRealm.where(RealmLikeBean.class).equalTo("id",srcId).findFirst();
RealmLikeBean targetBean = mRealm.where(RealmLikeBean.class).equalTo("id",targetId).findFirst();
mRealm.beginTransaction();
long srcBeanTime = srcBean.getTime();
srcBean.setTime(targetBean.getTime());
targetBean.setTime(srcBeanTime);
mRealm.commitTransaction();
}