安卓可回收视图滚动到顶部

14

这是我的onCreate函数,它处理适配器、LinearLayoutManager等内容。 我尝试了所有选项来尝试将其滚动到顶部,但都无法实现。 我甚至尝试创建自己的自定义LinearLayoutManager。

//Reson for static to call from a static method to scroll it up
private static RecyclerView taskRecyclerView;
private FirebaseAdapter firebaseAdapter;
private static LinearLayoutManager linearLayoutManager;

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    final View view = inflater.inflate(R.layout.fragment_tasklist, container, false);



    linearLayoutManager = new LinearLayoutManager(getActivity());

    taskRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_mainTask);
    databaseRef = FirebaseDatabase.getInstance().getReference().child(userAccount.getId());


    firebaseAdapter = new FirebaseAdapter(TaskObject.class, R.layout.one_task, TaskViewHolder.class, databaseRef.child("Task"), getContext());

    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    linearLayoutManager.setSmoothScrollbarEnabled(true);


    taskRecyclerView.setAdapter(firebaseAdapter);
    taskRecyclerView.setLayoutManager(linearLayoutManager);
    relativeLayoutAdd.setOnClickListener(this);
    //Listen for any data change
    databaseRef.child("Task").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //onDataChange called so remove progress bar

            //make a call to dataSnapshot.hasChildren() and based
            //on returned value show/hide empty view

            //use helper method to add an Observer to RecyclerView

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    databaseRef.child("Task").keepSynced(true);
    return view;
}

为什么要反转您的LLM? 每当recyclerview底部添加新内容时,您是否想要滚动到底部,就像消息应用程序一样? - Siavash Abdoli
我希望最新的始终在顶部。这就是为什么我要反转它。 - nnn
你能展示一个带有UI的例子吗?如果你想要将一个项目添加到RecyclerView的顶部,你不需要反转LLM,而是需要反转数组。如果可以的话,请用图片来解释它。我不确定你的问题是什么。 - Siavash Abdoli
1
我想要在每次添加一个项目时滚动到顶部,以便最新的项目位于顶部,而较旧的项目位于底部。 - nnn
linearLayoutManager.setReverseLayout(true); 这会导致问题吗? - rjbaj
3个回答

18

你尝试过taskRecyclerView.getLayoutManager().scrollToPosition(0)或者taskRecyclerView.scrollToPosition(your_position)吗?

taskRecyclerView.scrollToPosition(your_position)并没有实现任何滚动逻辑,而taskRecyclerView.getLayoutManager().scrollToPosition(0)更为具体,根据布局实现到具体的索引,对于线性布局来说就是0。


尝试过 taskRecyclerView.scrollToPosition(your_position)taskRecyclerView.getLayoutManager().scrollToPosition(0),这两个都可以工作。你能解释一下原因吗? - nnn
RecyclerView在taskRecyclerView.scrollToPosition(your_position)中没有实现任何滚动逻辑,而taskRecyclerView.getLayoutManager().scrollToPosition(0)更具体,它根据实现的布局去到特定的索引位置,在你的情况下是线性布局。 - Cătălin Florescu
我明白了。非常感谢! - nnn

2

RecyclerView中滚动到特定项目是一个棘手的部分,但下面的代码可以帮助滚动

平滑滚动的方法

fun Context.getSmoothScroll(): LinearSmoothScroller {
        return object : LinearSmoothScroller(this) {
            override fun getVerticalSnapPreference(): Int {
                return LinearSmoothScroller.SNAP_TO_START
            }
        }
    }

将平滑滚动应用于RecyclerView

fun RecyclerView.scrollToPositionSmooth(int: Int) {
        this.layoutManager?.startSmoothScroll(this.context.getSmoothScroll().apply {
            targetPosition = int
        })
    }

应用不带平滑效果的滚动到RecyclerView(快速)

fun RecyclerView.scrollToPositionFast(position: Int) {
        this.layoutManager?.scrollToPosition(position)
    }

代码使用
itemFilteredRecyclerView.scrollToPositionFast(0) //Normal Scroll
itemFilteredRecyclerView.scrollToPositionSmooth(0) //Smooth Scroll

额外信息: 您可以将 ..(0) 替换为需要滚动的位置。

完整代码:链接


-1

添加下面的代码也可以正常工作。

linearLayoutManager.setStackFromEnd(false);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接