编辑:如果有人在将来遇到同样的问题,这是一个非常简单的修复。我使用clearView(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder)来处理整个拖动完成后忘记调用它的超级方法。这就是它没有正确更新的原因。
原始问题:
以下是整个代码:https://github.com/vustav/Ppaaiinntt/tree/master/app/src/main/java/com/decent/rvtest
除非我在删除另一个元素后立即添加元素,否则一切正常。它确实存在。如果我添加另一个,旧列表和新元素之间的空间大小合适。我使用一个字符串,他们在打印之前添加它们的名字,它显示在那里,如果我拖动以改变它正确显示的元素的位置。
我的声誉不允许我发布图片,因此imgur-album必须这样做: http://imgur.com/a/bmb17
在第一张图片上有三个元素,字符串打印在底部。
第二张图片是在滑动之后。注意字符串已更新。
第三个是在添加另一个“111”之后。字符串是正确的,但它不会显示在视图中。
第四个是在添加另一个之后。字符串仍然正确,新元素显示在视图中。
拖动后的最后一张图片是为了更改最后两个元素的位置。现在一切都很好了。
这些是相关方法(我认为):
protected void add(PictureElement pe){
chain.add(pe);
notifyItemInserted(chain.size()-1);
}
public void remove(int position) {
chain.remove(position);
notifyItemRemoved(position);
}
protected void swap(int from, int to){
chain.swap(from, to);
notifyItemMoved(from, to);
}
编辑:onBindViewHolder,getItemCount和ViewHolder:
@Override
public int getItemCount() {
return chain.size();
}
@Override
public void onBindViewHolder(PEViewHolder PEViewHolder, int i) {
PictureElement pe = chain.get(i);
PEViewHolder.name.setText(pe.getName());
}
protected static class PEViewHolder extends RecyclerView.ViewHolder {
protected TextView name;
public PEViewHolder(View v) {
super(v);
name = (TextView) v.findViewById(R.id.txtName);
}
}
答案 0 :(得分:0)
有关您正在使用的不同通知方法的有趣报价
public final void notifyItemRemoved(int position)通知任何已注册的观察员先前位于该位置的项目 已从数据集中删除。以前位于和的项目 现在可以在oldPosition - 1找到位置之后。这是一个 结构变化事件。其他现有项目的代表 数据集仍被认为是最新的,不会反弹, 虽然他们的立场可能会改变。参数position:Position 现已删除的项目。
public final void notifyItemRangeChanged(int positionStart,int itemCount)通知任何已注册的观察者itemCount项目 从位置positionStart开始已经改变。相当于召唤 notifyItemRangeChanged(position,itemCount,null);.这是一个项目 改变事件,而不是结构改变事件。它表明任何 给定位置范围内的数据反映已过时 应该更新。给定范围内的项目保持不变 身份。
您是否可以尝试对此代码块进行评论并检查其是否有效
//Called by the ItemTouchHelper when the user interaction with an element is over and it also
// completed its animation
/*
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//update from where the action took place
mPEAdapter.updateChain(viewHolder.getLayoutPosition());
//clearView is called after onMove so any drags or swipes are complete
dragging = false;
mPEAdapter.setSwipe(false);
}
*/