簡體   English   中英

如何順利滾動到RecyclerView頂部的單擊項?

[英]How to smoothly scroll to clicked item to top of RecyclerView?

我有一個作為RecyclerView的項目列表(可擴展項目),並且我希望單擊時列表上的項目能夠平滑移動/滾動。

因此,假設我在第一個屏幕上具有以下列表,然后單擊項目“值6”。 我想通過將項目“值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>

和我的實際適配器(它是ScrollingActivity的內部類,適用於Google示例)

   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)什么也不做,因為該項目在屏幕上是實際的。 但是如何解決呢?

我嘗試從我的Expandable RecyclerView的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);
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM