recyclerview滚动条口吃

时间:2017-07-16 22:41:58

标签: java android android-recyclerview

我在this video中证明了这个问题,为什么会这样? setHasFixedSize没有解决问题,setHasStableIds也没有,也改变了滚动条样式,所以你可以正确看到它,但问题也出现在默认样式中。

这是我的代码:

适配器

    @Override
public void onBindViewHolder(final HadithViewHolder holder, int position) {
    final Hadith currentHadith = ahadith.get(position);
    final Context context = holder.itemView.getContext();
    /*number*/
    holder.numTextView.setText(Utils.ARABIC_NUMBER_FORMAT.format(position + 1));

        /*text*/
    final String text = currentHadith.text();
    holder.hadithTextView.setText(text);

    /*buttons*/
    holder.moreBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            PopupMenu popup = new PopupMenu(context, holder.moreBtn);
            MenuInflater inflater = popup.getMenuInflater();
            inflater.inflate(R.menu.menu_hadith_options, popup.getMenu());

            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()) {
                        case R.id.copy_item:
                            UTILS.copyHadith(context, currentHadith);
                            break;

                        case R.id.share_item:
                            UTILS.shareHadith(context, currentHadith);
                            break;

                        case R.id.lookup_item:
                            UTILS.webSearch(context, currentHadith);
                            break;

                        case R.id.save_item:
                            DBS_MANAGER.saveHadith(currentHadith);
                            Snackbar.make(((ResultsActivity) context).findViewById(R.id.recycler_view),
                                    R.string.removed_notification,
                                    Snackbar.LENGTH_SHORT).show();
                            break;
                    }
                    return true;
                }
            });
            popup.show();

        }
    });
}

活性

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                             android:id="@+id/main_content"
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent"
>


<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar"/>

</android.support.design.widget.AppBarLayout>

<include
    android:id="@+id/recycler_view"
    layout="@layout/recycler_view"/></android.support.design.widget.CoordinatorLayout>

recyclerview.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/saved_recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingTop="3dp"
    android:scrollbars="vertical"
    android:fadeScrollbars="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

1 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为RecyclerView中的各种项目都有不同的尺寸(即高度)。

滚动条的大小和位置取决于RecyclerView当前显示的内容以及屏幕上方和下方当前显示的项目数。 RecyclerView猜测所有项目的高度大致相同,并相应地绘制滚动条。

想象一下,你的RecyclerView现在正在显示一个非常高的项目,并且它上面有一个非常短的项目,下面有五个非常短的项目。就视图而言,所有项目都是相同的大小,因此滚动条只会是屏幕下方的1/6 - 2/6 ...直到您将那些非常短的项目滚动到视图中。