I have a view pager with three fragments (A->B->C):
Fragment A has two edittexts and a save button; Fragment B has a toolbar and a scrollable textview; Fragment C has a RecyclerView with a LinearLayout set to it.
On app launch, I swipe to Fragment B and I get an NPE on the view adapter getItemCount()
of my ListFragment (Fragment C). This happens on a physical test device (API 21) but not on any emulator (API 18-23).
What could be the cause?
EDIT: Add HomeActivity.class Interface Method:
@Override
public ArrayList<String> getList() {
titleSharedPref = getSharedPreferences(TITLE_PREF, Context.MODE_PRIVATE);
try {
this.songArrayList = (ArrayList<String>) ObjectSerializer
.deserialize(titleSharedPref.getString(TITLE_PREF, ObjectSerializer.serialize(new ArrayList<String>())));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return this.songArrayList;
}
ListFragment.class:
public class ListFragment extends Fragment {
private RecyclerView recyclerView;
private SongRecyclerViewAdapter recyclerViewAdapter;
private FragmentCommunicator communicator;
public ListFragment() {
// Required empty constructor
}
public static ListFragment newInstance() {
return new ListFragment();
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof FragmentCommunicator) {
communicator = (FragmentCommunicator) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement FragmentCommunicator");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_song_list, container, false);
// Set the adapter
if (view instanceof RecyclerView) {
Context context = view.getContext();
recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerViewAdapter = new SongRecyclerViewAdapter(communicator.getList(), communicator);
recyclerView.setAdapter(recyclerViewAdapter);
}
ItemTouchHelper.SimpleCallback simpleItemCallBack = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT){
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int pos = viewHolder.getAdapterPosition();
if (communicator.remove(pos)) {
recyclerViewAdapter.notifyItemRemoved(pos);
recyclerViewAdapter.notifyItemRangeChanged(pos, recyclerViewAdapter.getItemCount());
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemCallBack);
itemTouchHelper.attachToRecyclerView(recyclerView);
return view;
}
/**
* {@link RecyclerView.Adapter} that can display a {@link ArrayList} and makes a call to the
* specified {@link FragmentCommunicator}.
*/
public class SongRecyclerViewAdapter extends RecyclerView.Adapter<SongRecyclerViewAdapter.ViewHolder> {
private final ArrayList<String> mValues;
private final FragmentCommunicator communicator;
public SongRecyclerViewAdapter(ArrayList<String> items, FragmentCommunicator communicator) {
this.mValues = items;
this.communicator = communicator;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false));
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final TextView mContentView;
public String mItem;
public ViewHolder(View view) {
super(view);
mView = view;
mContentView = (TextView) view.findViewById(R.id.content);
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.mItem = mValues.get(position);
holder.mContentView.setText(holder.mItem);
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != communicator) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
communicator.respond(holder.mItem, HomeActivity.MODE_PICK);
}
}
});
}
@Override
public int getItemCount() {
return mValues.size();
}
}
@Override
public void onDetach() {
super.onDetach();
// kill
communicator = null;
recyclerViewAdapter = null;
}
}
EDIT: Removed second question: adding ViewPager listener.
Thank you all!