RecyclerView拖拽view后,itemView发生交换的规则重写,清华同方viewonlyitem

最近有个需求,要实现列表的itemView拖拽后,交换位置。网上搜索了一番,发现RecyclerView来实现此方案很容易,RecyclerView的默认几个api很强大,只需几行代码就可以实现简单的拖拽需求。

有一篇文章值得推荐给大家,RecyclerView 扩展(二) - 手把手教你认识ItemTouchHelper; https://juejin.im/post/5d750947f265da03ea5aa2a2  ItemTouchHelper(二)源码简析  https://www.jianshu.com/p/b8e45aa3a6ff

调用Callback的chooseDropTarget方法来找到符合交换条件的ItemView。这里符合的条件是指,选中的ItemView的bottom大于目标ItemView的bottom或者ItemView的top大于目标ItemView的top。通常来说,我们可以重写chooseDropTarget方法,来定义什么条件下就交换位置。

这里呢,直接说重点,我的需求是要自己来控制满足一定的条件,才能交换位置。

其实chooseDropTarget的默认实现已经满足了,他的规则是选中的ItemView的bottom大于目标itemView的bottom或者是top大于目标itemView的top值。

那么我这里想要实现的是,选中的selectedView的左右或者上下边界,接近targetView的边界,他们相减,有一个固定的差值,这里我定义为ScreenWidth() / 列数 / 单个itemView四等分

比如: int offsetWidth = ScreenWidth / 3/ 4;

下面直接看代码,可以比较下跟chooseDropTarget的默认实现的差异,其实差不多,就是加了个固定的差值。这样不需要拖拽到view的边界才发生交换

@Overridepublic RecyclerView.ViewHolder chooseDropTarget(RecyclerView.ViewHolder selected, List dropTargets, int curX, intcurY) {//return super.chooseDropTarget(selected, dropTargets, curX, curY);

int right = curX +selected.itemView.getWidth();int bottom = curY +selected.itemView.getHeight();

RecyclerView.ViewHolder winner= null;int winnerScore = -1;final int dx = curX -selected.itemView.getLeft();final int dy = curY -selected.itemView.getTop();final int targetsSize =dropTargets.size();for (int i = 0; i < targetsSize; i++) {final RecyclerView.ViewHolder target =dropTargets.get(i);int offsetWidth = (int) (DisplayUtils.getWindowWidth(selected.itemView.getContext()) / 12.0f);int offsetHeight =offsetWidth;if (dx > 0) {int diff = target.itemView.getRight() - offsetWidth -right;if (diff < 0 && target.itemView.getRight() >selected.itemView.getRight()) {final int score =Math.abs(diff);if (score >winnerScore) {

winnerScore=score;

winner=target;

}

}

}if (dx < 0) {int diff = target.itemView.getLeft() + offsetWidth -curX;if (diff > 0 && target.itemView.getLeft() winnerScore) {

winnerScore=score;

winner=target;

}

}

}if (dy < 0) {int diff = target.itemView.getTop() + offsetHeight -curY;if (diff > 0 && target.itemView.getTop() winnerScore) {

winnerScore=score;

winner=target;

}

}

}if (dy > 0) {int diff = target.itemView.getBottom() - offsetHeight -bottom;if (diff < 0 && target.itemView.getBottom() >selected.itemView.getBottom()) {final int score =Math.abs(diff);if (score >winnerScore) {

winnerScore=score;

winner=target;

}

}

}

}returnwinner;

}

http://www.dengb.com/Androidjc/1415544.htmlwww.dengb.comtruehttp://www.dengb.com/Androidjc/1415544.htmlTechArticleRecyclerView拖拽view后,itemView发生交换的规则重写,清华同方viewonlyitem 最近有个需求,要实现列表的itemView拖拽后,交换位置。网上搜索了一...

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐