Я делаю 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)
Это работает! Большое спасибо :) –
Добро пожаловать :) –