【问题标题】:updating custom view from database in viewpager when the fragment becomes visible当片段变得可见时,从 viewpager 中的数据库更新自定义视图
【发布时间】:2018-07-12 17:48:00
【问题描述】:

我在 viewpager 中有几个片段,我在第一个片段中设置了一些值 我必须用第一个片段中的值更新下一个片段,所以我将在第一个片段中创建的值存储在数据库中我正在尝试使用数据库中的值更新下一个视图,我正在使用 Room 作为数据库,现在我正在尝试遵循此答案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. 如果 Fragment 在查看之前已创建,则应初始化 lview 变量。以及当它变得可见时,为什么当我尝试对其调用方法时为什么会出现此异常。

  2. 当从视图分页器中的数据库更新视图(不是列表或回收器视图)时,应如何处理此类事情,其中​​后续视图将使用最后一个视图的输入进行更新。

【问题讨论】:

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


    【解决方案1】:

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

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

    ViewModel 和 LiveData 是来自 Google IO '17 的组件,但它们变得非常成熟,并且作为 Google IO '18 的标准,架构组件现在更加成熟。

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

    这是一个github 示例,说明如何做到这一点。虽然该代码中存在错误,但它应该提供一个很好的起点。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多