我在RecyclerView.Adapter中使用以下代码删除一个Item。如果当前滚动位置位于顶部,则一切正常。
如果滚动位置位于列表中间的某个位置,则列表会自动滚动到视图的顶部。
如何避免这种行为?
public class MyAdapter extends RecyclerView.Adapter {
...
public void removeItem(int pos){
mDataset.remove(pos); //List with Items
notifyItemRemoved(pos);
notifyItemRangeChanged(pos,mDataset.size());
}
}
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
...
</FrameLayout>
答案 0 :(得分:2)
添加以下行为我解决了
recyclerView.setHasFixedSize(true);
答案 1 :(得分:0)
您使用的回收商视图
yourRecylerView.scrollToPosition(position);
只需检查列表中是否存在此位置。
答案 2 :(得分:0)
在通知与RecyclerView
关联的数据集发生更改后,您需要滚动到已删除的位置。
是的,您只需在从notifyDataSetChanged()
删除项目后致电mDataset
。所以你的适配器看起来像这样。
public class MyAdapter extends RecyclerView.Adapter {
//... Code goes here
public void removeItem(int pos){
mDataset.remove(pos);
notifyDataSetChanged();
recyclerView.scrollToPosition(pos - 1);
}
}
答案 3 :(得分:0)
试试这个
这应该有用。
答案 4 :(得分:0)
试试这段代码:
public void removeItem(int position){
mdata.remove(position);
notifyItemRangeChanged(position,mdata.size());
}
答案 5 :(得分:0)
我在nestedScrollView中使用了recyclerView,并且遇到了同样的问题。这是调用以删除项目的代码
mDataset.remove(pos) // Remove from dataset
notifyItemRemoved(pos) // Show animation of removing
这是要添加到XML中以使其正确滚动的行(RecyclerView的焦点优先于其viewHolders,因此它不会滚动)
android:descendantFocusability="beforeDescendants"
android:nestedScrollingEnabled="false"
此后一切正常。
答案 6 :(得分:-1)
使用此:
mDataset.remove(pos);
adapter.notifyItemRemoved(pos);
adapter.notifyDataSetChanged();