【发布时间】:2018-02-26 17:18:06
【问题描述】:
我正在设置一个 Fragment(TabLayout) 和一个 ArrayAdapter 来显示单词列表。 我想在从 onLoadFinished() 中返回的源中完全获取数据后更新 Fragment。 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)
【问题讨论】:
-
你在哪里创建了 mAdapter 对象?
-
@MiteshMachhoya 它是片段类中的全局变量
-
请告诉我你是如何初始化的
-
私有 WordAdapter mAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { .... mAdapter = new WordAdapter(getActivity(), new ArrayList
()); ... } -
首先让我告诉你适配器没有提供任何 clear(),如果你在适配器类中创建了 clear(),那么请告诉我。
标签: android listview android-fragments