RecyclerView:未连接适配器;跳过布局 - 错误里面的片段
我有MainActivity持有三个选项卡。在每个选项卡中,我使用RecyclerView将从SQLite数据库获取的数据显示为列表。RecyclerView:未连接适配器;跳过布局 - 错误里面的片段
当我第一次启动应用程序的数据显示正确。在我返回之前打开的选项卡后,数据不存在。
的问题开始出现我已经实现后,以下:
- 检查适配器为null。
- 如果是,则创建适配器实例并填充数据。
- 如果没有,只需更新数据适配器的内部,并呼吁
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;
}
我编辑了自己的代码。请看一下。
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();
}
}
只需添加mDays = new ArrayList();在onCreatView中的上述代码中,以便它不会在ArrayList上抛出nullpointerexception。 – Drv
我已更新。查看。 –
我建议你在ViewPager中使用'FragmentPagerAdapter'来设置一个Tab View。 –
尝试在'getDays设置日志()'检查是否mDays尺寸(设定后)的方法是0,所以你(和我们)就可以知道问题是否出在该方法或适配器'了updateData '方法。并添加适配器代码以进行回答 – rsella
请发布您在其中处理碎片的活动代码。 –
据我了解,当我移动到其他选项卡活动选项卡调用'onPause','onStop'和'onDestroyView'。因此,我们正在失去recyclerView的状态。当我返回到选项卡时,它会再次初始化recyclerView。这里它不知道它之前已经连接过适配器。 – Marat