【问题标题】:Scroll Recycleview to Top position when activity starts using Linearlayoutmanager当活动开始使用 Linearlayoutmanager 时,将 Recycleview 滚动到顶部位置
【发布时间】:2019-01-12 13:06:52
【问题描述】:

我正在将 Firebase 实时数据库 检索到我的 Recycleview 适配器类。我想按日期对数据进行排序,最新帖子在顶部。我正在使用 p>

llm.setReverseLayout(true);

这可行,但现在当活动打开时,recycleview 会自动滚动到底部。但我希望它强制它置顶。

这是我的代码

         rv.setHasFixedSize(true);
         LinearLayoutManager llm = new LinearLayoutManager(this);
         llm.setReverseLayout(true);
         rv.setLayoutManager(llm);
         llm.scrollToPositionWithOffset(0, 0);
         rv.setAdapter(staggeredBooksAdapter);

我的整个代码是

public class SubjectBooks extends AppCompatActivity {
    FirebaseAuth fauth;
    String user;
    DatabaseReference dbreference,dbref;
    RecyclerView rv;
    String subject;
    int child_count=0;
    ArrayList<Books> list;
    SubjectBooksAdapter staggeredBooksAdapter;
    ProgressDialog progressDialog;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_subject_books);
        getSupportActionBar().setTitle(getIntent().getStringExtra("subject")+" Area");
        getSupportActionBar().setBackgroundDrawable(
                new ColorDrawable(Color.parseColor("#8abe50")));
     // this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
     // this.getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_share);



        fauth = FirebaseAuth.getInstance();
        subject = getIntent().getStringExtra("subject").trim();

        dbreference = FirebaseDatabase.getInstance().getReference("books").child(subject);
        dbreference.keepSynced(true);
        user = fauth.getCurrentUser().getEmail();

        list = new ArrayList<>();
        staggeredBooksAdapter = new SubjectBooksAdapter(list);

        rv = (RecyclerView) findViewById(R.id.recyclerView);

        final ProgressDialog  progressDialog = ProgressDialog.show(this, "Loading...", "Please wait...", true);
        progressDialog.setMessage("Please wait ...");
        progressDialog.setCanceledOnTouchOutside(true);
        progressDialog.show();

        rv.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        rv.setLayoutManager(llm);
        rv.setAdapter(staggeredBooksAdapter);

        dbreference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                final Books b1 = dataSnapshot.getValue(Books.class);
              //  Log.e("Value is ",dataSnapshot.getKey()+" "+b1.getBauthor());
                //Log.e("Book"," received");
                if(!user.equals(b1.getSelleremail()) || (user.equals(b1.getSelleremail())) ) {

                    child_count++;
                    list.add(b1);
                    staggeredBooksAdapter.notifyDataSetChanged();
                    progressDialog.dismiss();
                }


   
}

我用过

/Solution one
mLayoutManager.scrollToPositionWithOffset(0, 0);
//Solution Two
rv.scrollToPosition(0)
//Solution Three
setStackFromEnd(false)
//Solution Four
Collections.reverse();

但他们没有工作。

任何解决方案?提前致谢。

【问题讨论】:

  • 你只需要scrollToPosition(0); 你设置了适配器。
  • @forpas 所以我需要把你的代码放在 rv.setAdapter(staggeredBooksAdapter);??
  • 可以,前提是staggeredBooksAdapter 已经包含要显示的数据。
  • @forpas 我已经更新了我的整个代码,最后从 firebase 中检索了数据。 ..所以这是一个主要问题。我应该放置 scrollToPosition(0);最后?
  • 在适配器中拥有所有项目并调用 setAdapter() 或 notify..() 后,使用 scrollToPosition(0);

标签: java android firebase-realtime-database android-recyclerview


【解决方案1】:

不要使用开箱即用的设置现在将 false 传递给 llm.setReverseLayout(false);

当您从 firebase 获取数据时,只需使用 Collections.reverse(passyourlist);,该列表将原地反转。 之后将其传递给您的适配器,它会正常工作。

【讨论】:

  • @Abhishek..它也没有用。当我打开适配器时,它仍然滚动到底部,我必须手动滚动到顶部。
  • 更新了答案检查一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多