我有一个带有适配器和ViewHolder类的RecyclerView,所以它是3个类,我在我的ViewHolder中添加了一个onLongClick,当它被长时间单击时,所选项目将被删除,我删除它如下所示:
MyRV.Items.remove(getLayoutPosition());
MyRV.mAdapter.notifyItemRemoved(getLayoutPosition());
项目:
>
Item_5
Removing Item 2 - Item 2 removed .
Removing Item 3 (which is item 2 now) - Item 1 removed (item - 1) .
我的数据项大约有7项,所以下面是发生的情况。第一次删除时,它会删除正确的项目;当您再次单击“删除”时,它将删除上述项目,而不是删除选定项目;当大小为1时,它是FC,因为大小无效。
我的问题与此类似:使用 notifyItemRemoveed 或 notifyDataSetChanged with RecyclerView in Android
但是答案不管用,没有一个,从itemRange到index 1。
public class MyAdapterextends RecyclerView.Adapter<MyViewHolder> {
private List<MyItem> itemList;
public Context context;
public MyAdapter(Context context, List<MyItem> itemList) {
this.itemList = itemList;
this.context = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.myitem, null);
return new MyViewHolder(layoutView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.From.setText(itemList.get(holder.getAdapterPosition()).getFrom());
holder.To.setText(itemList.get(holder.getAdapterPosition()).getTo());
}
@Override
public int getItemCount() {
return this.itemList.size();
}
}
活动
LinearLayoutManager LinLayout = new LinearLayoutManager(MyActivity.this, LinearLayoutManager.VERTICAL, false);
mAdapter = new MyAdapter(MyActivity.this, Items);
RcView.setItemAnimator(new ItemAnimator());
RcView.setHasFixedSize(true);
RcView.setLayoutManager(LinLayout);
RcView.setAdapter(mAdapter);
好的,让我们解释一些基本的东西。
>
首先,通知DataSetChanged()
从适配器列表中刷新完整的RV布局,杀死所有动画。我们不希望这样。创建RV也是为了节省电池,如果我们一直调用这个方法,我们就做不好。
要删除一个项目,您可以将其从列表(ArrayList)中删除,并在调用通知项删除(您刚刚删除的项目的索引)
之后。执行动画。无需调用通知项更改()
!这样做将触发该位置项目的新绑定。
不要使用getLayoutPosition()
它将表示布局中的位置,而不是列表在适配器中的位置。要知道实际位置,必须调用getAdapterPosition()
。
不要在绑定中调用holder.getAdapterPosition()
,你已经有了位置
!
现在,您不需要为每个项目重新发明一个新的适配器,所以,考虑采用这个库FlexibleAdapter,因为它将处理所有开箱即用的基本功能(您不需要扩展它);您可以为您需要的每种视图类型自定义项目;视图持有者是预定义的:公共事件已经实现(单击和长时间单击);它保持旋转后的状态等等...
试试看:
adapter.remove(item);
adapter.notifyItemRemoved(position);
adapter.notifyItemRangeChanged(position, list.count());
我正在创建一个使用RecyclerView显示的卡片列表,其中每个卡片都有一个按钮,可以从列表中删除该卡片。 是否有人有使用notifyItemRemoved()的经验,并且知道它的行为与NotifyDataSetChanged不同的原因? 下面是我正在使用的一些代码:
我正在用AppWidgetHostViews填充RecyclerView。它们被排序一个比一个低,每个都有删除按钮旁边。这就是我如何设置RecyclerView和适配器(Event.Object是AppWidgetHostView): 这是保存AppWidgetHostViews的适配器: 因此它再次为适配器设置数据并通知数据集已更改。 但问题是,当我单击“删除”按钮时,项目没有被正确删除。Vie
我正在使用notify datasetchanged,我可以解决这个问题吗?
当试图从Eclipse Oxygen中删除一个项目时,什么也没有发生,日志中会写入一个异常。我只需在包浏览器中右键单击一个项目,然后选择“删除”选项。我用的是Eclipse Oxygen.1a (4.7.1a)。以下是完整的构建信息: 下面是一个堆栈跟踪示例: 任何想法如何解决这个问题?或任何解决方法?
问题内容: 我很难从OneToMany协会中删除孩子。我的实体: 我删除孩子的尝试失败: 这可行,但是我认为那不是正确的方法: 我在这里做错了什么? 由于 强尼 问题答案: 关联是双向的,并且双向关联的拥有方是没有mappedBy属性的一方。这意味着在这种情况下,拥有方是项目方。 Hibernate仅考虑拥有方知道关联是否存在。这意味着要破坏人员与项目之间的关联,必须将人员设置为项目中的。
问题内容: 我有一个正在使用的。我以前用过但从未遇到过这个问题。 当我上下滚动时,某些项目消失,而某些消失的项目再次出现在底部。 码: : : 问题答案: 重用Views,因此可以说是第一次调用is 。这将导致该行的可见度为。 当又被称为绑定一个新行,该行的观点依然是-没有什么是复位之间势必行。 因此,您的if语句应完全重置状态: 这将确保正确设置每一行的可见性。