RecyclerView:未连接适配器;跳过布局 - 错误里面的片段

问题描述:

我有MainActivity持有三个选项卡。在每个选项卡中,我使用RecyclerView将从SQLite数据库获取的数据显示为列表。RecyclerView:未连接适配器;跳过布局 - 错误里面的片段

当我第一次启动应用程序的数据显示正确。在我返回之前打开的选项卡后,数据不存在。

的问题开始出现我已经实现后,以下:

  1. 检查适配器为null。
  2. 如果是,则创建适配器实例并填充数据。
  3. 如果没有,只需更新数据适配器的内部,并呼吁notifyDataSetChanged()

这个想法在其他项目中,我不得不做同样的活动与工作。在这种情况下,我有片段。我刚刚才知道Fragment具有不同的生命周期行为。

我该如何解决这个问题?

有一个标签类:

public class AllTabView extends Fragment { 

Context ourContext; 

RecyclerView mList; 
AllAdapter adapter; 
RecyclerView.LayoutManager layoutManager; 
TextView mEmptyText; 

long movedItem, draggedItem; 

ArrayList<ArrayList<String>> mDays; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v1 = inflater.inflate(R.layout.list_view_content, container, false); 

    mList = (RecyclerView) v1.findViewById(R.id.recycler_view); 
    mEmptyText = (TextView) v1.findViewById(R.id.empty_text); 
    ourContext = getContext(); 

    layoutManager = new LinearLayoutManager(ourContext); 
    mList.setLayoutManager(layoutManager); 
    RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
    mList.setItemAnimator(itemAnimator); 

    return v1; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getDays(); 

    if (mDays.size() == 0) { 
     mList.setVisibility(View.GONE); 
     mEmptyText.setVisibility(View.VISIBLE); 
    } else { 
     mList.setVisibility(View.VISIBLE); 
     mEmptyText.setVisibility(View.GONE); 

     if(adapter == null) { 
      Log.v(TAG, "adapter null"); 
      adapter = new AllAdapter(ourContext, mDays); 
     } 
     else { 
      Log.v(TAG, "notify"); 
      adapter.updateData(mDays); 
     } 

     mList.setAdapter(adapter); 
    } 
} 

public void getDays() { 
    DaysDatabase info = new DaysDatabase(ourContext); 
    info.open(); 
    mDays = info.getData(); 
    info.close(); 
} 

public void setAdapter() { 
    adapter = new AllAdapter(ourContext, mDays); 
    mList.setAdapter(adapter); 
} 
} 

MainActivity持有片段:

public class MainActivity extends AppCompatActivity { 

FragmentTabHost mFragmentTabHost; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

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

    String tag1 = "all"; 
    String tag2 = "since"; 
    String tag3 = "until"; 

    final View tabView1 = createTabView(MainActivity.this, "All"); 
    final View tabView2 = createTabView(MainActivity.this, "Since"); 
    final View tabView3 = createTabView(MainActivity.this, "Until"); 

    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag1).setIndicator(tabView1).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag1) { 
      return tabView1; 
     } 
    }), AllTabView.class, null); 
    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag2).setIndicator(tabView2).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag2) { 
      return tabView2; 
     } 
    }), SinceTabView.class, null); 
    mFragmentTabHost.addTab(mFragmentTabHost.newTabSpec(tag3).setIndicator(tabView3).setContent(new FragmentTabHost.TabContentFactory() { 
     public View createTabContent(String tag1) { 
      return tabView3; 
     } 
    }), UntilTabView.class, null); 

    mFragmentTabHost.getTabWidget().setDividerDrawable(R.drawable.tab_divider); 

} 

private static View createTabView(final Context context, final String text) { 
    View view = LayoutInflater.from(context).inflate(R.layout.tabs_bg, null); 
    TextView tv = (TextView) view.findViewById(R.id.tabsText); 
    tv.setText(text); 
    return view; 
} 
+0

尝试在'getDays设置日志()'检查是否mDays尺寸(设定后)的方法是0,所以你(和我们)就可以知道问题是否出在该方法或适配器'了updateData '方法。并添加适配器代码以进行回答 – rsella

+0

请发布您在其中处理碎片的活动代码。 –

+1

据我了解,当我移动到其他选项卡活动选项卡调用'onPause','onStop'和'onDestroyView'。因此,我们正在失去recyclerView的状态。当我返回到选项卡时,它会再次初始化recyclerView。这里它不知道它之前已经连接过适配器。 – Marat

我编辑了自己的代码。请看一下。

public class AllTabView extends Fragment { 

Context ourContext; 

RecyclerView mList; 
AllAdapter adapter; 
RecyclerView.LayoutManager layoutManager; 
TextView mEmptyText; 

long movedItem, draggedItem; 

ArrayList<ArrayList<String>> mDays = new ArrayList<>(); 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v1 = inflater.inflate(R.layout.list_view_content, container, false); 

    mList = (RecyclerView) v1.findViewById(R.id.recycler_view); 
    mEmptyText = (TextView) v1.findViewById(R.id.empty_text); 
    ourContext = getContext(); 
    layoutManager = new LinearLayoutManager(ourContext); 
    mList.setLayoutManager(layoutManager); 
    getDays(); 
    RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator(); 
    mList.setItemAnimator(itemAnimator); 
    adapter = new AllAdapter(ourContext, mDays); 
    mList.setAdapter(adapter); 
    return v1; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    getDays(); 
    if (mDays.size() == 0) { 
     mList.setVisibility(View.GONE); 
     mEmptyText.setVisibility(View.VISIBLE); 
    } else { 
     mList.setVisibility(View.VISIBLE); 
     mEmptyText.setVisibility(View.GONE); 
    } 
} 

public void getDays() { 
    DaysDatabase info = new DaysDatabase(ourContext); 
    info.open(); 
    mDays.clear(); 
    mDays.addAll(info.getData()); 
    if (adapter != null) 
     adapter.notifyDataSetChanged(); 
    info.close(); 
} 
} 
+0

只需添加mDays = new ArrayList();在onCreatView中的上述代码中,以便它不会在ArrayList上抛出nullpointerexception。 – Drv

+0

我已更新。查看。 –

+0

我建议你在ViewPager中使用'FragmentPagerAdapter'来设置一个Tab View。 –