在ListFragment上遇到这个问题,我认为这是适配器的错,但无法弄清楚为什么会发生这种情况:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
可能包含错误的代码:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getActivity().getIntent();
ArrayList<String> history = intent.getStringArrayListExtra("HistoryList");
ListView historyList = getListView();
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, history);
historyList.setAdapter(listAdapter);
}
启动历史记录的片段:
public class PrimaryFragment extends Fragment {
@Nullable
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.primary_layout, null);
}
ArrayList<String> history = new ArrayList<String>();
//START//
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
NumberFormat nf = new DecimalFormat("##.###");
SharedPreferences mDefaultPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
Set<String> set = mDefaultPreferences.getStringSet("key", null);
if(set != null){
history = new ArrayList<String>(set);
}
TextView money = (TextView) getActivity().findViewById(R.id.textCool);
String storedValue = mDefaultPreferences.getString("last known value", String.valueOf(0));
money.setText(storedValue);
}
+
public void history(View view){
Intent intent = new Intent(getActivity(), History.class);
intent.putStringArrayListExtra("HistoryList", history);
startActivity(intent);
}
logcat最相关的部分:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
10-23 21:01:32.268 12036-12036/com.androidbelieve.drawerwithswipetabs E/AndroidRuntime: at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:337)
10-23 21:01:32.268 12036-12036/com.androidbelieve.drawerwithswipetabs E/AndroidRuntime: at android.widget.ListView.setAdapter(ListView.java:491)
10-23 21:01:32.268 12036-12036/com.androidbelieve.drawerwithswipetabs E/AndroidRuntime: at com.androidbelieve.drawerwithswipetabs.History.onActivityCreated(History.java:26)
编辑:
我想我已经开始明白错误是什么了:
我正在使用ListFragment
填充ArrayList
,其中Fragment
在另一个code
(主要版本)中得到了它的价值,但这个Activities
首次用于{基于{1}}的应用,使用Button
将这些值传递给其他Activity
。
但现在这些都是fragments
并且在同一个ViewPager
中,那么我没有Buttons
来启动History
片段,我只需要刷卡< / em>的。所以我的新问题是:
如何将ArrayString
值传递给History ListFragment
知道我无法通过Button
启动它,但我使用 Swipe } EM>吗
我试过研究LifeCycle
但是没想出任何东西,让我知道你会想出什么!
答案 0 :(得分:2)
使用putStringArrayListExtra
时需要包前缀public Intent putStringArrayListExtra (String name,ArrayList value)
在API级别1中添加将扩展数据添加到intent。这个名字必须 包括包前缀,例如app com.android.contacts 会使用像&#34; com.android.contacts.ShowAll&#34;。
这样的名字参数name包含前缀的额外数据的名称。 value ArrayList数据值。
您需要将软件包名称添加到用于存储数组列表的字符串中。
public void history(View view){
Intent intent = new Intent(getActivity(), History.class);
intent.putStringArrayListExtra("com.androidbelieve.drawerwithswipetabs.historylist", history);
startActivity(intent);
}
答案 1 :(得分:0)
我建议将Bundle与你的Intent一起使用,并通过Bundle.putParcelableArrayList()
将ArrayList粘贴在Bundle中。
Intent intent = new Intent(getActivity(), History.class);
Bundle extras = new Bundle();
extras.putParcelableArrayList("HistoryList", history);
// intent.putExtras(extras);
startActivity(intent, extras); // can put as above, or do this instead
+
Intent intent = getActivity().getIntent();
Bundle extras = intent.getExtras();
ArrayList<String> history = extras.getParcelableArrayList("HistoryList");
由于您使用的是片段,因此您应该可以这样做。或者,如果您不想在Activity中处理Bundle对象,可以从within the Fragment进行。
Bundle extras = new Bundle();
extras.putParcelableArrayList("HistoryList", history);
MyFragment frag = MyFragment.getInstance();
frag.setArguments(extras);
/* Fragment Transition code */
+
public class MyFragment {
public MyFragment() { ... }
public MyFragment getInstance( ) { ... }
public void onCreate( ... ) {
this.history = new ArrayList<String>();
}
public View onCreateView( ... ) {
Bundle args = getArguments();
if (args != null && args.containsKey("History")) {
List<String> temp = getArguments().getParcelableArrayList("History");
this.history.addAll(temp);
getListAdapter().notifyDataSetChanged();
}
}
}