如何使用asynctaskloader在片段中更新ArrayAdapter



我正在设置一个片段(tabrayout(和一个arrayadapter,以显示单词列表。我想在完全从onloadFined((中返回的源获取数据后更新片段。Asynctaskloader设置在MainActivity中。

@Override
public void onLoadFinished(Loader<List<Word>> loader, List<Word> words) {
            if (words != null && !words.isEmpty()) {
        NounsFragment nounsFragment = new NounsFragment();
        nounsFragment.updateList(words);
        NumberFragment numberFragment = new NumberFragment();
        numberFragment.updateList(words);
        Log.v(LOG_TAG, "OnFinishedLoad status : " + words.size());
    }else{
        Toast.makeText(this, R.string.no_words, Toast.LENGTH_SHORT).show();
    }
}

然后,我在片段updatelist((中调用该函数以更新片段。

 public void updateList(List<Word> words) {
    // Hide loading indicator because the data has been loaded
    //View loadingIndicator = rootView.findViewById(R.id.loading_indicator);
    //loadingIndicator.setVisibility(View.GONE);
    //TextView loadingTextView = rootView.findViewById(R.id.loading_text_view);
    //loadingTextView.setVisibility(View.GONE);
    mAdapter.clear();
    if (words != null && !words.isEmpty()) {
        List<Word> wordsList = new ArrayList<>();
        for (int i = 0; i < words.size(); i++) {
            Word word = words.get(i);
            Log.v(LOG_TAG, "Current Word Category: " + word.getmCategory());
            if (word.getmCategory() != null) {
                if (word.getmCategory().contains("1"))
                    wordsList.add(word);
                Log.v(LOG_TAG, "Item Added: " + word.getmEnglishTranslation());
            }
        }
        //words.add(new Word("Uhr", "Clock", 2));
        //words.add(new Word("Bleistift","Pencil", 1 ));
        mAdapter.addAll(wordsList);
    } else {
        // Set empty state text to display "No earthquakes found."
        mEmptyStateTextView.setText(R.string.no_words);
        Toast.makeText(getActivity(), R.string.no_words, Toast.LENGTH_SHORT).show();
    }
}

我会遇到运行时错误

 FATAL EXCEPTION: main
Process: com.example.android.german, PID: 24298
                                                                        java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.android.german.WordAdapter.clear()' on a null object reference
at com.example.android.german.NounsFragment.updateList(NounsFragment.java:63)
                                                                            at com.example.android.german.MainActivity.onLoadFinished(MainActivity.java:83)
                                                                            at com.example.android.german.MainActivity.onLoadFinished(MainActivity.java:22)
                                                                            at android.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:483)
                                                                            at android.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:451)
                                                                            at android.content.Loader.deliverResult(Loader.java:144)
                                                                            at android.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:265)
                                                                            at android.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:92)
                                                                            at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                                            at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                                            at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                            at android.os.Looper.loop(Looper.java:148)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

基本上您需要在继续前了解2件事,第一个async任务将在背景线程中执行操作,并使用OnPostExecute将收到的数据传递给主线程((,其次,您需要更新UI 已成功收到数据时。

现在您需要遵循简单的步骤1.创建一个listView/recyclerview通过设置适配器和内容来显示数据。2.列出

等项目的空列表
List<Word> words = new ArrayList<>();

此步骤很重要,因为您不应该重新创建列表或重新分配变量单词。3.使用asynctask在背景线程中执行任务,并使用OnPostExecute((在主线程上接收数据4.收到数据将其传递给主动脉或要将其传递给主攻击的活动后,可以使用诸如setupui((之类的方法来完成,该方法返回列表&lt;>。5.清除上一个列表以避免重复项目,然后使用list.addall((将所有项目添加到现有列表中。6.从那里致电notifydatasetchanged((更新UI

mAdapter.notifyDatasetChanged()

最新更新