ItemDecoration覆盖getItemOffsets()和动画

jef*_*don 6 android android-animation recycler-adapter android-recyclerview

我申请的利润率等于我对RecyclerView使用GridLayoutManager通过重写getItemOffsets()方法(见下面我的代码)。

但是,当从适配器中删除对象时,将在没有偏移的情况下调用删除动画。因此,酰胺化在与要去除的物体不同的位置开始。

我试图通过来获取位置,getSpanIndex(position)但是位置(parent.getChildAdapterPosition(view))返回,NO_POSITION因为调用时已将对象从适配器中移除getItemOffsets()。

有什么办法可以抵消我的情况吗?

@Override
public void getItemOffsets(Rect outRect, View view, 
                     RecyclerView parent, RecyclerView.State state) {

    GridLayoutManager mgr = parent.getLayoutManager();
    int position = parent.getChildAdapterPosition(view);

    if (position == RecyclerView.NO_POSITION) {
       // here I need to access the position of the current element
       // and call outRect.set(left, top , right, bottom);
       // which is not possible because it is no longer in the adapter
        return;
    } 

    int spanCount = mgr.getSpanCount();
    int spanSize = mgr.getSpanSizeLookup().getSpanSize(position);
    int spanIndex = mgr.getSpanSizeLookup().getSpanIndex(position, spanCount);

    if (spanIndex == spanCount-1) {
        // last element
        left = space / 2;
        right = space;
    } else if (spanIndex == 0) {
        // first element
        left = space;
        right = space / 2;
    } else {
        // middle element
        left = space / 2;
        right = space / 2;
    }
    outRect.set(left, top, right, bottom);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*jak 6

尝试使用视图LayoutParams。如果您不使用某些自定义LayoutManager,它应该包含您需要的信息。

int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewAdapterPosition();
Run Code Online (Sandbox Code Playgroud)


小智 5

事实上,从父母那里获得孩子的位置并不是一个好的决定。视图的实际状态可能与真实状态不同,因为同时正在工作,或者 ItemDecorator、LayoutManager、RecyclerView 来规则它们,或者 Adapter 来改变某些元素的位置。

\n\n

更好的方法是,当要求 Recycler 为您提供某些视图的 ViewHolder 时。然后您可以获得所需的全部信息(getLayoutPosition()、getAdapterPosition())。

\n\n
parent.getChildViewHolder(view).getLayoutPosition();\nparent.getChildViewHolder(view).getAdapterPosition;\n
Run Code Online (Sandbox Code Playgroud)\n\n

还有另一个建议,不是来自你的案例。如果您需要获取 ItemCount,请不要使用adapter.getItemCount(),最好从状态获取,因为 Adapter 和 Recycler 中的项目计数可能不同。

\n\n
state.getItemCount()\n
Run Code Online (Sandbox Code Playgroud)\n