我正在使用recyclelerView(TwowayView),当数据发生变化时,它表现得很奇怪(在滚动中)。我使用以下代码为它设置适配器(每次数据更改)。
// sites = list , rvlinks = twowayview
adapter = new SitesAdapter(getActivity(), rvLinks, LinksFragment.this, sites);
rvLinks.setAdapter(adapter);
为了更好地理解,我制作了错误视频。
如图所示,尽管列表中只有2个项目,但Recyclerview的顶部和底部区域较大(见图片)。
仅使用notifyDatasetChanged()
会产生相同的结果。被困在这里。
Recyclerview具有固定的尺寸设置。
rvLinks.setHasFixedSize(true);
任何帮助都会很棒。
这是我的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();
}
}
答案 0 :(得分:1)
尝试为您的recyclerview设置一个确切的高度,因为它不尊重wrap_content,设置match_parent将采用listview下方整个空间的高度
一旦您开始看到结果,您可以使用自定义布局管理器进行回收查看,覆盖onMeasure()。
选中此示例
答案 1 :(得分:0)
根据@random的建议,我尝试了match_parent,但问题与TwoWayView
相同。所以我决定在support-v7 lib中将其更改为RecyclerView
。
令人惊讶的是,它按预期工作。可能是它在自己的GridLayoutManager
做了一些奇特的工作导致了这个问题。 Recyclerview的GridlayoutManager
效果很好。
感谢您的帮助。 :)