RecylcerView滚动到Top on Item Removed

时间:2016-04-04 10:37:41

标签: android android-recyclerview

我在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>

7 个答案:

答案 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)

试试这个

  1. mDataset.remove(POS);
  2. adapter.notifyItemRemoved(POS);
  3. adapter.notifyDataSetChanged();
  4. 这应该有用。

答案 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();