RecyclerView中删除条目后的重叠视图

5

从RecyclerView中删除项目可能会导致视图重叠,如此视频所示 链接

fragment_feed.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none" />

在适配器中

holder.setIsRecyclable(false);
  ((PostViewHolder) holder).mUsername.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteItem(holder.getAdapterPosition());
            }
        });

void deleteItem(int index) {
    postList.remove(index);
    notifyItemRemoved(index);

}

当我将notifyItemRemoved(index);更改为notifyDataSetChanged();时,似乎解决了我的问题,但是移除动画被破坏了。 我试图找到解决方案来解决这个问题,但似乎没有人与我有同样的问题。谢谢回答。
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
    holder.setIsRecyclable(false);
    if (holder instanceof PostViewHolder) {
        Post post = (Post) postList.get(position);
        String type = post.getTypePost();

        // Inflate Layout //
        LayoutInflater inflater = LayoutInflater.from(mContext);


        ((PostViewHolder) holder).mUsername.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                deleteItem(holder.getAdapterPosition());
            }
        });

        ((PostViewHolder) holder).mUsername.setText(post.getOwnerPost());


    } else if (holder instanceof HeaderViewHolder) {

    } else{
        ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
    }
}

尝试移除 holder.setIsRecyclable(false); 这行代码。 - Bharath Kumar
@BharathKumar 看起来好像可以工作,但我担心在recyclerView中位置不正确。谢谢:D - JustKhit
3个回答

6
在onBindViewHolder中添加clickListener,并像下面一样更改代码。
PostViewHolder postViewHolder=(PostViewHolder) holder;
postViewHolder.mUsername.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {
            deleteItem(holder.getAdapterPosition());
        }
    });

void deleteItem(int index) {
    postList.remove(index);
    notifyItemRemoved(index);
    notifyItemRangeChanged(position, yourDataSet.size());
}
holder.setIsRecyclable(true);

在删除时,始终从数据列表中删除项目,然后通知适配器。同时,当每个viewholder数据具有不同的数据状态时,请使用holder.setIsRecyclable(false)。

当我将setIsRecyclable(false)更改为(true)或删除它时,问题似乎已经解决了。谢谢XD。 - JustKhit
SetIsRecyclable仅在您不想回收回收器视图时使用。所以你得到了错误。无论如何,很高兴听到它已解决 :) - Sharath kumar

2
在您的活动级别上,当您将适配器与Recycler View绑定时,在调用notifyDataSetChanged()之前需要清除列表。
请使用以下代码行:
```java list.clear(); adapter.notifyDataSetChanged(); ```
adapter.clearData();

and

adapter.notifyDataSetChanged();

在deleteItem()方法中:-
void deleteItem(int index) {
    postList.remove(index);
    notifyItemRemoved(index);
    notifyItemRangeChanged(index, getItemCount() - index);
}

如需更多帮助,请访问以下链接: https://github.com/kanytu/android-parallax-recyclerview/issues/13


0
尝试一下。
void deleteItem(int index) {
    postList.remove(index);
    notifyItemRemoved(index);

    //notify items from index to end
    notifyItemRangeChanged(index, getItemCount() - index);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接