RecyclerView:没有附加适配器;跳过布局 - 片段内部错误

RecyclerView: No adapter is attached; skipping layout - error inside of Fragment

我有包含三个选项卡的 MainActivity。在每个选项卡中,我使用 RecyclerView 显示从 SQLite 数据库中获取的数据作为列表。

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

在我执行以下操作后问题开始出现:

  1. 检查适配器是否为空。
  2. 如果是,创建适配器实例并用数据填充它。
  3. 如果没有,更新adapter里面的数据,然后调用notifyDataSetChanged()

这个想法在我必须对 Activity 做同样事情的其他项目中起作用。在这种情况下,我有片段。我刚刚了解到 Fragment 具有不同的生命周期行为。

我该如何解决这个问题?

选项卡之一 class:

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);
}
}

包含片段的主要Activity:

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();
}
}