Ich verwende einen ViewPager mit einem RecyclerView innerhalb des ersten Fragments des ViewPagers.Fehler mit ViewPager und RecyclerView
Wenn ich von links nach rechts blättern, keine Fehler. Aber wenn ich rechts nach links bewegen (von # 2 für # 1-Fragment des ViewPager), der folgende Fehler auftritt:
05-10 20:21:07.546 20002-20002/com.graffiti75.android.worldremit E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.graffiti75.android.worldremit, PID: 20002
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v7.widget.RecyclerView$LayoutManager.canScrollHorizontally()' on a null object reference
at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:1819)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1960)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2405)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2049)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2369)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1719)
at android.app.Activity.dispatchTouchEvent(Activity.java:2742)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2330)
at android.view.View.dispatchPointerEvent(View.java:8666)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4123)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3989)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5807)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5781)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5752)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5897)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:143)
at android.os.Looper.loop(Looper.java:122)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
05-10 20:21:07.549 550-7690/? W/ActivityManager﹕ Force finishing activity 1 com.graffiti75.android.worldremit/.activity.WalkthroughActivity
Das ist der Fehler: java.lang.NullPointerException: Der Versuch, virtuelle Methode aufrufen ' boolean android.support.v7.widget.RecyclerView $ LayoutManager.canScrollHorizontally() 'auf einem Null-Objekt-Referenz
Die folgende Methode ist das erste Fragment meines ViewPager. Wenn ich die Zeilen kommentiere, in denen der RecyclerView aufgerufen wird, treten keine Fehler auf. Aber ich brauche diese RecyclerView, um meine Kontakte zu durchsuchen! Also ich denke, das beweist der Fehler in den Zeilen passiert ...
public class ContactListFragment extends Fragment {
//--------------------------------------------------
// Constructor
//--------------------------------------------------
public static ContactListFragment newInstance() {
ContactListFragment fragment = new ContactListFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
public ContactListFragment() {
// Required empty public constructor
}
//--------------------------------------------------
// Fragment Life Cycle
//--------------------------------------------------
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment.
View v = inflater.inflate(R.layout.fragment_contact_list, container, false);
// Get data.
List<String> nameList = new ArrayList<String>();
Cursor cursor = getContacts();
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
nameList.add(name);
}
// Setup list.
RecyclerView recyclerView = (RecyclerView) v.findViewById(R.id.id_recycler_view);
recyclerView.setHasFixedSize(true);
Activity activity = getActivity();
final LinearLayoutManager layoutManager = new LinearLayoutManager(activity);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(new ContactListAdapter(getActivity(), nameList));
return v;
}
//--------------------------------------------------
// Methods
//--------------------------------------------------
private Cursor getContacts() {
// Run query.
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] { ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME };
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + ("1") + "'";
String[] selectionArgs = null;
//String sortOrder = ContactsContract.Contacts._ID + " COLLATE LOCALIZED ASC";
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
return getActivity().managedQuery(uri, projection, selection, selectionArgs, sortOrder);
}
}
Die Zeile unter: // Setup-Liste.
Ich recherchierte eine Menge in Google und ich konnte keinen Weg finden, um diese Fehler zu beheben.
Hat jemand eine Vermutung?
Hat sich dieses Problem in einem anderen Aspekt Ihrer App gezeigt? Zum Beispiel hatte ich dieses Problem auch in einer ähnlichen Situation: Ich fügte ein drittes Fragment innerhalb eines ViewPagers hinzu, jedes der Fragmente hatte einen RecyclerView. Die Ausnahme trat nur dann auf, wenn vom dritten Fragment zurück zum zweiten gescrollt wurde, genau wie bei Ihrem zweiten von dem ersten. Das Problem endete damit, dass ich keinen Initialisierungscode anwendete, der das RecyclerView.Adapter des dritten Fragments instanziieren würde (was, wenn es null ist, diese Ausnahme auslöst). – ibgib