GeekNews icon indicating copy to clipboard operation
GeekNews copied to clipboard

likeFragment中onMove方法存在bug

Open cylcc06 opened this issue 8 years ago • 1 comments

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的时间不会存在上诉问题。

cylcc06 avatar Sep 10 '17 13:09 cylcc06

使用下面方法没有问题。

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

cylcc06 avatar Sep 10 '17 13:09 cylcc06