【问题标题】:keep Recyclerview on tab change在标签更改时保持 Recyclerview
【发布时间】:2017-02-22 22:24:51
【问题描述】:

即使在切换标签后,我也试图保持 recyclerview 被填满。 我已经做了一段时间了,尝试了几种方法,但都没有奏效。

MainActivity.java

 @Override
 protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = getIntent();

    initTab
 }

 private void initTab(){

    //tab setup
    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup(MainActivity.this,getSupportFragmentManager(),android.R.id.tabcontent);

    ...

    mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator(createTabView(icon_search, "search")),
            searchFragment.class, null);
    ...more tabs added...
    return;

片段

 private RecyclerView results;

 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         final Bundle savedInstanceState){

    View v = inflater.inflate(R.layout.tab_search, container, false);
    results = (RecyclerView) v.findViewById(R.id.search_results);
    results.setHasFixedSize(true);

    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    results.setLayoutManager(mLayoutManager);
    ScrollListener mScrollListener = new ScrollListener(mLayoutManager);
    results.setAdapter(searchResultsAdapter);
    results.addOnScrollListener(mScrollListener);

    return v;

我不能将 mLayoutManager 设为单例,否则我会从 recyclerview 收到错误,例如

"LayoutManager 已经附加到一个 RecyclerView"

纵向模式被锁定,MainActivity 没有切换到其他活动

【问题讨论】:

    标签: android android-recyclerview fragment


    【解决方案1】:

    当您从片段中交换出来时,它会被卸载以保留内存。然后,当你换回它时,它需要从头开始重新加载。这就是您的 RecyclerView 丢失其项目的原因。您可以尝试找到一种方法来阻止它被卸载,但由于 Android 的内存有限,我们并不想热情地放弃很好的内存管理功能。

    您希望您的 RecyclerView 保留其项目。这个问题的答案在于 RecyclerView 首先是如何获取它的项目的。 RecyclerView 只是管理加载其RecyclerView.Adapter 所说的任何项目的子集。如果RecyclerView.Adapter.getItemCount() 返回 0,那么 RecyclerView 将不会加载任何内容。所以,RecyclerView.Adapter 才是真正的罪魁祸首。

    如果您这样做是为了让您的 RecyclerView.Adapter 记住它在创建时最后拥有的项目列表,而不是始终以空列表开头,那么您的 RecyclerView 将呈现该列表。

    现在您的问题是关于持久化对象列表(相对简单),而不是试图让一些视图在后台保持膨胀(相对复杂并且由于内存问题而有些不受欢迎)。

    希望这会有所帮助。

    【讨论】:

    • 我明白了。我怀疑适配器是罪魁祸首,我应该测试它。很简单,我只是将适配器设置为单例并且它被保留了下来。以前我让它在 onCreateView 中实例化
    • 我很高兴这对你来说是一个简单的改变!如果您认为该答案回答了您的问题,能否请您将此答案标记为已回答。
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多