2015-05-10 3 views
9

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?

+1

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

Antwort

2

Ich hatte das gleiche Problem, ich erstellte Unterklasse von ViewPager, die diesen Fehler behandelt. Ich hoffe, dies wird dir helfen.

public class HackyViewPager extends ViewPager { 


public HackyViewPager(Context context) { 
    super(context); 
} 

public HackyViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    try { 
     return super.onInterceptTouchEvent(ev); 
    } catch (Throwable t) { 
     t.printStackTrace(); 
     return false; 
    } 
}} 
+0

Ja, hat mir sehr geholfen! Vielen Dank!!! – graffiti75