2015-10-31 3 views
0

Я делаю Android-приложение, которое содержит в одном упражнении TabLayout с несколькими фрагментами. Эти фрагменты показывают RecyclerView, если есть контент, доступный на моем сервере или EmptyView, если нет содержимого.Ошибка приложения при горизонтальном прокрутке

Однако, когда у меня нет содержимого на активной вкладке, если я выполняю горизонтальную прокрутку между вкладками, приложение вылетает. Эта проблема не возникает, если я перемещаюсь между вкладками, нажимая на них. Как я могу это исправить?

Мои коды:

MessagesActivity.java:

public class MessagesActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

private Toolbar toolbar; 
private NavigationView navigationView; 
private TabLayout tabLayout; 
private ViewPager pager; 
private FloatingActionButton newMessageButton; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.messagesactivity); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    pager = (ViewPager) findViewById(R.id.messagesActivity_viewPager); 
    setupViewPager(pager); 

    tabLayout = (TabLayout) findViewById(R.id.messagesActivity_tabs); 
    tabLayout.setupWithViewPager(pager); 
    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      pager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 
     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
     } 
    }); 
} 

private void setupViewPager(ViewPager viewPager) { 
    MessagesTabAdapter adapter = new MessagesTabAdapter(getSupportFragmentManager()); 

    adapter.addFragment(new MessagesInboxTab(), getResources().getString(R.string.Inbox)); 
    adapter.addFragment(new MessagesSentTab(), getResources().getString(R.string.Sent)); 
    adapter.addFragment(new MessagesTrashTab(), getResources().getString(R.string.Trash)); 

    viewPager.setAdapter(adapter); 
} 

class MessagesTabAdapter extends FragmentPagerAdapter { 

    private final List<Fragment> fragmentList = new ArrayList<>(); 
    private final List<String> fragmentTitleList = new ArrayList<>(); 

    public MessagesTabAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return fragmentList.get(position); 
    } 

    @Override 
    public int getCount() { 
     return fragmentList.size(); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return fragmentTitleList.get(position); 
    } 

    public void addFragment(Fragment fragment, String title) { 
     fragmentList.add(fragment); 
     fragmentTitleList.add(title); 
    } 
} 
} 

MessagesInboxTab.java: (К моменту все вкладки содержит этот класс)

public class MessagesInboxTab extends Fragment { 
private RecyclerView recyclerView; 
private ScrollView emptyView; 
private ProgressBar progressView; 
private ArrayList<MessageListItem> inboxList = new ArrayList<MessageListItem>(); 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.list_tab, container, false); 
    progressView = (ProgressBar) view.findViewById(R.id.progressBar_list); 
    emptyView = (ScrollView) view.findViewById(R.id.emptyView_list); 
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView_list); 

    progressView.setVisibility(View.VISIBLE); 

    getInbox(); 

    return view; 
} 

public void getInbox() { 
    JsonObjectRequest jsonRequest = new JsonObjectRequest 
      (Request.Method.GET, "http://my_domain.com/service/inbox", (String) null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        //Check if there are messages 

        if (result!=null) { //There are messages 
         //Handle messages and store info in InboxList 

         final MessagesListItemAdapter adapter = new MessagesListItemAdapter(inboxList); 
         final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
         layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 

         recyclerView.setLayoutManager(layoutManager); 
         recyclerView.setHasFixedSize(true); 
         recyclerView.setAdapter(adapter); 
         recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 
         recyclerView.setItemAnimator(new DefaultItemAnimator()); 
         adapter.notifyDataSetChanged(); 

         progressView.setVisibility(View.GONE); 
         recyclerView.setVisibility(View.VISIBLE); 
        } else { //No messages 
         progressView.setVisibility(View.GONE); 
         emptyView.setVisibility(View.VISIBLE); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        error.printStackTrace(); 
       } 
      }); 

    Volley.newRequestQueue(getActivity()).add(jsonRequest); 
} 
} 

Xml фрагмента:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<ProgressBar 
    android:id="@+id/progressBar_list" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="8dp" 
    android:layout_centerInParent="true" 
    style="?android:attr/progressBarStyleLarge" /> 

<LinearLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/recyclerView_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

     <ScrollView 
      android:id="@+id/emptyView_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" > 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:paddingTop="93.3dp" 
       android:paddingBottom="93.3dp" 
       android:background="#000000" > 

      </RelativeLayout> 

     </ScrollView> 

</LinearLayout> 

</RelativeLayout> 

Наконец, код ошибки:

Exception in MessageQueue callback: handleReceiveCallback 
java.lang.NullPointerException 
at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:2022) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1833) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2244) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1907) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1938) 
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1392) 
at android.app.Activity.dispatchTouchEvent(Activity.java:2408) 
at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59) 
at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1886) 
at android.view.View.dispatchPointerEvent(View.java:7323) 
at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3521) 
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3455) 
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4544) 
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4523) 
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4619) 
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
at android.os.MessageQueue.nativePollOnce(Native Method) 
at android.os.MessageQueue.next(MessageQueue.java:125) 
at android.os.Looper.loop(Looper.java:140) 
at android.app.ActivityThread.main(ActivityThread.java:5086) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584) 
at dalvik.system.NativeStart.main(Native Method) 

ответ

1

Добавьте к этому ваш onCreateView() из Fragment

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(layoutManager); 

Я думаю, что это происходит потому, что вы не устанавливать какие-либо LayoutManager, когда нет содержания, поэтому его лучше установить один

+0

Это работает! Большое спасибо :) –

+0

Добро пожаловать :) –