当片段可见时,从viewpager中的数据库更新自定义视图

时间:2018-07-12 17:48:01

标签: java android android-fragments android-viewpager android-room

我在viewpager中有几个片段,我在第一个片段中设置了一些值,我必须用第一个片段中的值更新下一个片段,因此我将在第一个片段中创建的值存储在数据库中并且我正在尝试使用数据库中的值更新下一个视图,我正在使用Room for database,现在我正在尝试遵循此答案How to determine when fragment becomes visible in viewpager 中所述的方法以及我正在做的事情我正在创建一个新线程来访问数据库并从数据库更新全局变量bodyScore。这是一些代码

public class MindFragment extends Fragment implements FragmentLifecycle {
SeekBar mindSeekBar;
private View rootView;
ViewPager viewPager;
private int seekBarProgress;
private Date date = new Date();

private static final String TAG = MindFragment.class.getSimpleName();

private LifeWheelView lview;
private volatile int bodyScore;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.activity_fill, container, false);
    viewPager = getActivity().findViewById(R.id.viewpager);

    lview = rootView.findViewById(R.id.lifeWheelView);
    lview.setMind(bodyScore, 0);
}

@Override
public void onResumeFragment() {
    Log.i(TAG, "onResumeFragment()");
    Thread thread = new Thread(new Runnable() {
        ScoreDao mScoreDao;
        CategoryDao mCategoryDao;
        @Override
        public void run() {
            LifewheelRoomDatabase db = LifewheelRoomDatabase.getDatabase(getContext());
            mScoreDao = db.scoreDao();
            mCategoryDao = db.categoryDao();

            CategoryName categoryName = mCategoryDao.getCategoryByName("Body");

            Integer category_id = categoryName.getId();

            int bodyScoreExceptionFlag = 0;
            while ( bodyScoreExceptionFlag == 0 ) {
                try {
                    Score st = mScoreDao.getScoreByCategory(HelperMethods.getStartOfDay(), HelperMethods.getEndOfDay(), category_id);
                    if( st == null) {
                        bodyScore = 0;
                    }
                    else {
                        bodyScore = st.score;
                    }
                    bodyScoreExceptionFlag++;
                } catch (NullPointerException e) {
                    continue;
                }
            }
        }
    });
    thread.start(); 
    lview.setMind(bodyScore, 0);
}
}

lview.setMind(bodyScore,0);行上,我得到了NullPointerException

所以我的问题是:

  1. 如果在查看之前已创建了片段,则lview变量应初始化。当它变得可见时,为什么当我尝试在其上调用方法时,为什么会出现此异常。

  2. 从视图分页器中的数据库更新视图(而不是列表视图或回收者视图)时,应如何处理类似的事情,该视图分页器使用最后一个视图的输入来更新后续视图。

1 个答案:

答案 0 :(得分:0)

如果您尚未这样做,请查看使用视图模型在片段之间共享数据。

Google提供了一种简单的Inter-Fragment Communication using Shared ViewModel方法。

ViewModel和LiveData是来自Google IO '17的组件,但它们已经真正成熟,并且成为Google IO '18的标准,架构组件现在已经成熟得多。

这是使用最少的代码启动和运行应用程序的简单方法。

下面是一个github示例,说明了如何执行此操作。该代码中有一个错误,但它应该提供一个很好的起点。