【问题标题】:How to smoothly scroll to clicked item to top of RecyclerView?如何平滑滚动到 RecyclerView 顶部的单击项目?
【发布时间】:2016-04-13 11:42:38
【问题描述】:

我有一个项目列表作为 RecyclerView(可扩展项目),我希望列表中的项目在单击时平滑移动/滚动。

假设我在第一个屏幕上有如下列表,然后单击项目“值 6”。我想通过将项目“value 6”平滑滚动到顶部来实现第二个屏幕上的情况。

我的布局:

    <?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                app:layout_collapseMode="pin" />

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

    <android.support.v7.widget.RecyclerView 
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        />
</android.support.design.widget.CoordinatorLayout>

还有我的实际适配器(它是用于 Google 示例的 ScrollingActivity 中的内部类)

   public class Adapter extends RecyclerView.Adapter<Adapter.ItemHolder> {

        Container[] values;

        public Adapter() {
            values = new Container[100];
            for (int i = 0; i < values.length; i++) {
                values[i] = new Container();
                values[i].text = "value " + i;
            }

        }

        @Override
        public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new ItemHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false));
        }

        @Override
        public void onBindViewHolder(ItemHolder holder, int position) {
            holder.text.setText(values[position].text);
            holder.more.setVisibility(values[position].visibility);
        }

        @Override
        public int getItemCount() {
            return values.length;
        }

        public class ItemHolder extends RecyclerView.ViewHolder {

            private final TextView more; //it is expandable part
            TextView text;                

            public ItemHolder(View itemView) {
                super(itemView);
                text = (TextView) itemView.findViewById(R.id.text);
                more = (TextView) itemView.findViewById(R.id.more);

                text.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        int pos = getAdapterPosition();
                        if (more.getVisibility() == View.VISIBLE) {
                            more.setVisibility(View.GONE);
                            values[pos].visibility = View.GONE;
                        } else {
                            more.setVisibility(View.VISIBLE);
                            values[pos].visibility = View.VISIBLE;

                            int vfpos = linearLayoutManager.findFirstCompletelyVisibleItemPosition();
                            int d = pos - vfpos;
                            recyclerView.smoothScrollToPosition(pos);
                        }
                    }
                });
            }
         }
    }

所以我想念什么? 我想recyclerView.smoothScrollToPosition(pos) 什么都不做,因为这个项目在屏幕上是真实的。但是如何解决呢?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我尝试为我的 Expandable RecyclerView 编辑来自 Move/scroll clicked listitem view at top of screen in the expandablelistview 的答案,它可以工作。

    onLayoutExpanded() 只是一个在视图展开时调用的抽象方法。

    recyclerAdapter = new RecyclerAdapter(this, recyclerData) {
        @Override
        public void onLayoutExpanded(int position) {
            int offset = position - recyclerLayoutManager.findFirstVisibleItemPosition();
            if (recyclerLayoutManager.findFirstVisibleItemPosition() > 0) offset -= 1;
            recyclerLayoutManager.scrollToPositionWithOffset(position, offset);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多