2016-08-17 1 views
3

두 개의 탭이 포함 된 ViewLay와 TabLayout이있는 Activity가 있습니다. 이 탭은 Recyclerview를 포함하는 재사용되는 하나의 Fragment입니다. 따라서 각 조각/탭에는 일련의 항목이있는 recyclerview가 있습니다.안드로이드 TabLayout 두 개의 탭이 있고 각각의 recyclerview는 전환 할 때 맨 위로 스크롤됩니다.

이 탭 사이를 전환하면 이전 탭으로 돌아갈 때 스크롤 상태가 유지되지 않습니다.

무엇이 누락 되었습니까?

활동 :

public class EventsActivity extends AbstractTracActivity implements OnRowClickListener { 

    @BindView(R.id.toolbar) 
    Toolbar toolbar; 

    @BindView(R.id.tabs) 
    TabLayout tabLayout; 

    @BindView(R.id.viewpager) 
    ViewPager viewPager; 

    private final String TAG = EventsActivity.class.getSimpleName(); 

    private static Context context; 
    private SearchView searchView; 
    private static EventListFragment eventsFragment, clubsFragment; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     setTheme(R.style.TracTracAppTheme); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.events); 
     ButterKnife.bind(this); 

     context = this; 

     setSupportActionBar(toolbar); 
     if (getSupportActionBar() != null) { 
      getSupportActionBar().setLogo(R.drawable.tractrac_logo); 
      getSupportActionBar().setDisplayShowTitleEnabled(false); 
     } 

     eventsFragment = EventListFragment.newInstance(EventListFragment.ListType.EVENTS); 
     clubsFragment = EventListFragment.newInstance(EventListFragment.ListType.CLUBS); 

     TabLayout.Tab events = tabLayout.newTab(); 
     TabLayout.Tab clubs = tabLayout.newTab(); 

     tabLayout.addTab(events, 0); 
     tabLayout.addTab(clubs, 1); 

     tabLayout.setTabTextColors(ContextCompat.getColorStateList(this, R.color.accent)); 
     tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(this, R.color.accent)); 

     ViewPagerAdapter adapter = new ViewPagerAdapter (getSupportFragmentManager()); 
     viewPager.setAdapter(adapter); 
     tabLayout.setupWithViewPager(viewPager); 

     viewPager.setOffscreenPageLimit(2); 
     viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } 

      @Override 
      public void onPageSelected(int position) { } 

      @Override 
      public void onPageScrollStateChanged(int state) { 
       searchView.setQuery("", true); 
       searchView.clearFocus(); 
       searchView.setIconified(true); 
       eventsFragment.filterList(null); 
       clubsFragment.filterList(null); 
      } 
     }); 
    } 

    ... 

    public static class ViewPagerAdapter extends FragmentPagerAdapter { 

     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 1: 
        return clubsFragment; 
       default: 
        return eventsFragment; 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 1: 
        return context.getResources().getString(R.string.section_clubs); 
       default: 
        return context.getResources().getString(R.string.section_events); 
      } 
     } 
    } 
} 

조각 : 당신이 스크롤 상태 인 리셋의 원인 인 새로운 EventsRecyclerAdapter 때마다 생성되는 곳 onPageScrollStateChanged에서

public class EventListFragment extends Fragment implements EventsFragmentPresenter.ViewInterface { 

    enum ListType { EVENTS, CLUBS } 

    private EventsFragmentPresenter presenter; 
    private ListType listType; 
    private List<Event> events; 
    private RecyclerView recyclerView; 

    public static EventListFragment newInstance(ListType listType) { 
     EventListFragment f = new EventListFragment(); 
     Bundle args = new Bundle(); 
     args.putSerializable("listType", listType); 
     f.setArguments(args); 
     return f; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(com.tractrac.androidlib.R.layout.base_list_fragment, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 

     recyclerView = (RecyclerView) view.findViewById(com.tractrac.androidlib.R.id.recycler_view); 

     switch (getListType()) { 
      case EVENTS: 
       getPresenter().getEvents(); 
       break; 
      case CLUBS: 
       getPresenter().getClubEvents(); 
       break; 
     } 
    } 

    private EventsFragmentPresenter getPresenter() { 
     if (presenter == null) { 
      presenter = new EventsFragmentPresenter(); 
      presenter.initialize(this); 
     } 
     return presenter; 
    } 

    private ListType getListType() { 
     if (listType == null) { 
      listType = (ListType) getArguments().getSerializable("listType"); 
     } 
     return listType; 
    } 

    @Override 
    public void listReady(List<Event> events) { 
     EventsRecyclerAdapter adapter = new EventsRecyclerAdapter(events, (EventsActivity) getActivity()); 
     RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext()); 
     recyclerView.setLayoutManager(mLayoutManager); 
     recyclerView.setItemAnimator(new DefaultItemAnimator()); 
     recyclerView.setAdapter(adapter); 

     if (getListType() == ListType.EVENTS) { 
      mLayoutManager.scrollToPosition(getPresenter().getCurrentDayEventIndex(events)); 
     } 
     this.events = events; 
     ((EventsActivity) getActivity()).hideSpinner(); 
    } 

    public void filterList(String filterBy) { 
     if (TextUtils.isEmpty(filterBy)) { 
      EventsRecyclerAdapter adapter = new EventsRecyclerAdapter(events, (EventsActivity) getActivity()); 
      recyclerView.setAdapter(adapter); 
      return; 
     } 

     List<Event> filteredEvents = new ArrayList<>(); 
     for (Event event : events) { 
      if (event.getName().toLowerCase().contains(filterBy) || event.getLocation().toLowerCase().contains(filterBy)) 
       filteredEvents.add(event); 
     } 
     EventsRecyclerAdapter adapter = new EventsRecyclerAdapter(filteredEvents, (EventsActivity) getActivity()); 
     recyclerView.setAdapter(adapter); 
    } 
} 

답변

0

당신이 filterList을 요구하고있다.

어댑터를 RecyclerView으로 한 번 설정하고 나중에 notify 메쏘드를 호출해야합니다.

관련 문제