2015-05-10 44 views
9

Tôi đang sử dụng một ViewPager với RecyclerView bên trong phần đầu tiên của ViewPager.Lỗi với ViewPager và RecyclerView

Khi tôi cuộn sang trái sang phải, không có lỗi. Nhưng khi tôi di chuyển sang phải sang trái (từ # 2 cho # 1 mảnh của ViewPager), các lỗi sau xảy ra:

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 

Đó là lỗi: java.lang.NullPointerException: Cố gắng để gọi phương thức ảo ' boolean android.support.v7.widget.RecyclerView $ LayoutManager.canScrollHorizontally() 'trên tham chiếu đối tượng null

Phương thức dưới đây là Phân đoạn đầu tiên của ViewPager của tôi. Khi tôi bình luận các dòng nơi RecyclerView được gọi, không có lỗi xảy ra. Nhưng tôi cần RecyclerView này để duyệt danh bạ của tôi! Vì vậy, tôi đoán điều này chứng minh lỗi xảy ra trong các dòng đó ...

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); 
    } 
} 

Những dòng dưới đây: // Danh sách thiết lập.

Tôi đã nghiên cứu A LOT trong Google và tôi không thể tìm thấy cách để giải quyết lỗi này.

Có ai đoán không?

+1

Sự cố này có thể tự giới thiệu ở bất kỳ khía cạnh nào khác trong ứng dụng của bạn không? Ví dụ, tôi cũng đã có vấn đề này trong một tình huống tương tự: Tôi đã thêm một mảnh thứ ba bên trong một ViewPager, mỗi mảnh vỡ có một RecyclerView. Ngoại lệ chỉ xảy ra khi cuộn từ đoạn thứ ba trở lại phần thứ hai, giống như của bạn từ phần thứ hai đến phần thứ nhất. Vấn đề đã kết thúc là tôi đã không gọi một số mã khởi tạo mà có thể khởi tạo RecyclerView.Adapter của đoạn thứ ba (nếu nó không ném ra ngoại lệ này). – ibgib

Trả lời

2

Tôi gặp vấn đề tương tự, tôi đã tạo lớp con từ ViewPager, xử lý lỗi này. Tôi hy vọng điều này sẽ giúp bạn.

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

Có, đã giúp tôi rất nhiều! Cảm ơn!!! – graffiti75

Các vấn đề liên quan