RecyclerView数据集更改时奇怪的滚动

时间:2015-04-06 10:22:13

标签: android scroll android-recyclerview

我正在使用recyclelerView(TwowayView),当数据发生变化时,它表现得很奇怪(在滚动中)。我使用以下代码为它设置适配器(每次数据更改)。

// sites = list , rvlinks = twowayview

    adapter = new SitesAdapter(getActivity(), rvLinks, LinksFragment.this, sites);
    rvLinks.setAdapter(adapter);

为了更好地理解,我制作了错误视频。

https://youtu.be/xPvHper3gpc

如图所示,尽管列表中只有2个项目,但Recyclerview的顶部和底部区域较大(见图片)。

仅使用notifyDatasetChanged()会产生相同的结果。被困在这里。

Recyclerview具有固定的尺寸设置。

rvLinks.setHasFixedSize(true);

任何帮助都会很棒。

enter image description here

这是我的xml布局:

 <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/dummyview"
    android:layout_below="@+id/sp_category"
    android:layout_marginTop="15dp"
    android:background="@drawable/white_round">

    <Widget.EmptyRecyclerView
    android:id="@+id/rv_links"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:drawSelectorOnTop="false"

    android:orientation="vertical"
    app:twowayview_layoutManager="GridLayoutManager"
    app:twowayview_numColumns="2"

    tools:context=".MainActivity" />



    <TextView
        android:id="@+id/tv_empty"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="No Sites Found" />

</RelativeLayout>

这是我的RecyclerView,实现了emptyView。

public class EmptyRecyclerView extends TwoWayView {
    private View emptyView;
    final private AdapterDataObserver observer = new AdapterDataObserver() {
        @Override
        public void onChanged() {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            checkIfEmpty();
        }

        @Override
        public void onItemRangeRemoved(int positionStart, int itemCount) {
            checkIfEmpty();
        }
    };

    public EmptyRecyclerView(Context context) {
        super(context);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmptyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    void checkIfEmpty() {
        if (emptyView != null && getAdapter() != null) {
            final boolean emptyViewVisible = getAdapter().getItemCount() == 0;
            emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
            setVisibility(emptyViewVisible ? GONE : VISIBLE);
        }
    }

    @Override
    public void setAdapter(Adapter adapter) {
        final Adapter oldAdapter = getAdapter();
        if (oldAdapter != null) {
            oldAdapter.unregisterAdapterDataObserver(observer);
        }
        super.setAdapter(adapter);
        if (adapter != null) {
            adapter.registerAdapterDataObserver(observer);
        }

        checkIfEmpty();
    }

    public void setEmptyView(View emptyView) {
        this.emptyView = emptyView;
        checkIfEmpty();
    }
}

2 个答案:

答案 0 :(得分:1)

尝试为您的recyclerview设置一个确切的高度,因为它不尊重wrap_content,设置match_parent将采用listview下方整个空间的高度

一旦您开始看到结果,您可以使用自定义布局管理器进行回收查看,覆盖onMeasure()。

选中此示例

Nested Recycler view height doesn't wrap its content

答案 1 :(得分:0)

根据@random的建议,我尝试了match_parent,但问题与TwoWayView相同。所以我决定在support-v7 lib中将其更改为RecyclerView

令人惊讶的是,它按预期工作。可能是它在自己的GridLayoutManager做了一些奇特的工作导致了这个问题。 Recyclerview的GridlayoutManager效果很好。

感谢您的帮助。 :)

相关问题