当前位置: 首页 > 知识库问答 >
问题:

如果视图计数很小,则RecyclerView不循环视图

阴高寒
2023-03-14

我一直在处理Recycler视图中的一个奇怪行为,如果适配器中的视图计数很小,在我的例子中,大小为5的情况下,视图不会被回收,当视图被滚动回屏幕时,onBindViewHolder也不会被调用。例如,如果我将大小增加到10个视图,则循环开始工作,每次视图进入屏幕时都会调用onBindViewHolder。

XML

<android.support.v4.widget.SwipeRefreshLayout
    android:id="@+id/swipeRefresh"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <!-- RECYCLER VIEW -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/eventsList"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

回收器视图初始化

    LinearLayoutManager llm = new LinearLayoutManager(getActivity());
    llm.setOrientation(LinearLayoutManager.VERTICAL);

    eventsList.setLayoutManager(llm);

    //Sets endless listener
    scrollListener = new EndlessRecyclerOnScrollListener(llm,3,mLastDownloadedPage) {
        @Override
        public void onLoadMore(int current_page) {
            Timber.d("Loading date for page: " + current_page);

            mLastDownloadedPage = current_page;

            //If it's showing cached don't download
            if(showingCached)
                return;

            //Shows snackbar loading view
            showSnackbarLoadingView();

            //Gets events
            getEvents(false);

        }
    };

    //eventsList.addOnScrollListener(scrollListener);

    //Set the adapter
    mAdapter = new EventListAdapter(this,getActivity().getApplicationContext());

    eventsList.setAdapter(mAdapter);

适配器

@Override
public EventHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    Timber.d("Create view holder pos: "+i);

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_events_row, viewGroup, false);
    return new EventHolder(v,mListener);

}

@Override
public void onBindViewHolder(EventHolder eventHolder, int i) {

    if(mBindListener != null)
        mBindListener.onBind(eventHolder,i);

    Timber.d("Bind view holder pos "+i);

    Event event = eventList.get(i);
    eventHolder.bindEvent(event);

    //Sets the date
    setDate(eventHolder.date, event);

    //Sets the location
    setLocation(eventHolder.distance,event);


}

在屏幕中只有3个可视视图,大小为5,当我向下滚动时,我可以看到位置4和5调用了createViewHolderbindViewHolder,但当我滚动到顶部时,它们在退出屏幕时不会被回收。我可以确认这一点,因为

@Override
public void onViewRecycled(EventHolder holder) {
    super.onViewRecycled(holder);
    Timber.d("onViewRecycled: "+holder.name);
}

没有记录任何消息。但是,如果视图计数增加,例如大小为10,则一切正常,视图被回收,每个位置都会调用onBindViewHolder

这是正常的行为吗?如果这是我如何保存项目视图的状态,例如激活状态,我用来保存变量中的活动位置,然后使用这一行来激活视图时,它进入屏幕使用绑定方法

        holder.itemView.setActivated(pos == lastSelectedPos);

共有1个答案

钱黎明
2023-03-14

这是正常的行为,但你可以调整它:

recyclerView.setItemViewCacheSize(int);

关于问题的第二部分——你说得对!将“激活”位置作为变量存储在适配器中。在onBindViewHolder()中,执行以下操作:

holder.itemView.setActivated(holder.getAdapterPosition() == lastSelectedPos);
 类似资料:
  • 实现循环ScrollView。有以下特色: 1、循环的scrollview 2、类似于tableview的编程方式 3、可定制化的内容 4、灵活运用可用于移步加载图片 5、结构化,可扩展性高 [Code4App.com]

  • 我的循环视图滚动太慢了。当我通过触摸Recyclerview开始滚动时,它会滞后,但当从上方的视图开始滚动时不会滞后。我还禁用了recyclerview上的嵌套滚动。 这是我的布局: 这是一个滞后的视频。就像滚动跳过了一些布局。

  • 所以我在垂直ScrollView中有一个水平回收器视图。我的布局中的所有内容都显示得很好,并且都按照我想要的方向滚动,并且它做得很好。 我唯一的问题是,RecyclerView位于ScrollView中其他内容的下方,当RecyclerViewer部分可见时,它会在启动时将RecyclerView的底部与屏幕的底部对齐。这意味着RecyclerView上方的内容被推离屏幕。 有谁知道为什么会发生这

  • Vuejs的视图,使用了"指令"(directive). 下面分别来说. 注意: 无论是v-if 还是v-for, 都要与某个标签结合使用. 这点跟JSP, PHP, Rails很不同. 循环: v-for <tr v-for="blog in blogs"> <td >{{blog.title }}</td> </tr> 上面代码,会被渲染成: <tr> <td>...</td>

  • 我用于在布局文件中放置一个特殊视图,如文档中所述,以便在没有数据时显示。此视图的id为。

  • 我在类似的问题中搜索过,试过几个答案都没有解决..我有显示城市名称和一些数据的水平回收器视图,问题是我在主回收器视图适配器中的每个位置放置了如下图所示的画布条形图或RV图表,为了水平滚动该图表,我将图表放在水平滚动视图中,以便在从右向左滚动该图表时查看长水平方向上的图表数据,反之亦然,但实际上它并不水平滚动,只有主回收器视图水平滚动到 当触摸它时显示城市,当触摸它滚动(冻结)时RV内的图表没有滚动