使用滑动删除另一个元素后,添加的元素不会显示在RecyclerView中

时间:2016-10-06 17:24:15

标签: android android-layout android-recyclerview

编辑:如果有人在将来遇到同样的问题,这是一个非常简单的修复。我使用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);
    }
}

1 个答案:

答案 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);
    }
*/