【问题标题】:Notify CursorLoader while TextView in Toolbar changed工具栏中的 TextView 更改时通知 CursorLoader
【发布时间】:2017-10-07 08:50:10
【问题描述】:

我的工具栏中有一个 TextView,这个 TextView 显示一个选定的日期(例如,2017 年 10 月 7 日,星期六)。这个工具栏在我的 MainActivity 中,在这个 MainActivity 里面我有一个带有 ListView 的片段。此 ListView 使用 ContentResolver 链接到我的 SQLiteDatabase,并且此数据库中的值按日期过滤。

我有以下问题:我希望每当我更改 MainActivity 工具栏中的 TextView 时,我的 Fragment 中的 CursorLoader 都会得到通知。

例如:我将日期 (TextView) 设置为 2017 年 10 月 6 日,ListView 会显示从 6 月 6 日开始的所有条目。

我在 TextView 上使用 TextWatcher 进行了尝试,但它不起作用(不知道我必须如何设置 TextChangeListener),我使用 Cursor Loader 的 onContentChanged() 方法进行了尝试。

没有什么对我有用...也许你有一个想法。

编辑:

只是为了更好的理解。我的日期变量是 public static final 所以我可以在 CursorLoader 中访问。我的 Fragment CursorLoader 中的选择如下:

String selection = DoingContract.COLUMN_DATE + "=?";
String[] selectionArgs = {MainActivity.mDate};

日期变量的更新方式如下:

public void setupToolbar(String date) {
    mDate = date;
    mToolbarTextView.setText(mDate);
}

setupToolbar 方法中的日期参数来自我的 DatePicker Dialog:

public void onDateSet(DatePicker datePicker, int year, int month, int day) {
    Calendar newDate = Calendar.getInstance();
    newDate.set(year, month, day);
    String date = mDateFormat.format(newDate.getTime());
    if (main != null) {
        main.setupToolbar(date);
    } else {
        entry.setupDate(date);
    }
}

【问题讨论】:

    标签: android sqlite android-textwatcher


    【解决方案1】:

    在 TextView 中使用 TextChangeListener 并在文本更改时重新启动加载程序,如下所示:

    textView.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //set the charSequense s to some variable that the cursor loader have access to.
            //todo
            // then restart the loader.
            getLoaderManager().restartLoader(/*args*/); 
        }
    
        @Override
        public void afterTextChanged(Editable s) {
        }
    });
    

    【讨论】:

    • 嘿纳宾。我已经编辑了我的问题。我尝试了你的建议,但它对我不起作用。 CursorLoader 在 Fragment 内部,TextView 在 Activity 内部。当我尝试你的建议时,我在加载器管理器上得到一个空指针异常
    • 你试过getActivity().getLoaderManager() 吗?
    • 我没有机会写getActivity,因为TextChangeListener已经在Activity中了。
    • 哦,我的理解正好相反。为什么不将fragment的引用保存在activity中并使用fragment.getLoaderManager();?
    • 嘿,我现在创建了对片段的引用。我的代码是DoingFragment doingFragment = new DoingFragment,然后是doingFragment.getLoaderManager().restartLoader(DoingFragment.TODO_LOADER, null, null);,但这给了我一个错误:IllegalStateException: Fragment DoingFragment{e0221fa} not attach to Activity。 TODO Loader 是 Fragment CursorLoader 的 ID
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多