【发布时间】:2015-08-02 16:26:22
【问题描述】:
我有一个片段,其中包含一个 RecyclerView 来显示给定日期的事件。我正在使用 ViewPager 将片段分成多天;周六活动的片段和周日活动的片段。
但是,两个 Fragment 似乎都引用了相同的 RecyclerView 和/或 Adapter,因为它只是显示事件的最后一个选项卡(在本例中为星期日)。
在我的具体情况下,周六有两个活动,周日没有活动。两个 Fragment 都有空的 RecyclerViews。为了证实我的理论,它是由最后一个标签引起的,我切换了日期。这导致两个 RecyclerViews 都有两个事件(星期六的事件)。
这里是各个片段的相关代码:
public class EventListFragment extends Fragment{
private EventAdapter mEventAdapter;
private static final String DATE_ARG = "eventDate";
public static EventListFragment newInstance(LocalDate date){
EventListFragment eventListFragment = new EventListFragment();
Bundle args = new Bundle();
args.putSerializable(DATE_ARG, date);
eventListFragment.setArguments(args);
return eventListFragment;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_event_list, container, false);
// Setup recyclerview
RecyclerView eventRecyclerView = (RecyclerView) view.findViewById(R.id.event_recycler_view);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
eventRecyclerView.setLayoutManager(layoutManager);
// Get date
LocalDate eventDate = (LocalDate) getArguments().getSerializable(DATE_ARG);
// Set adapter
mEventAdapter = new EventAdapter(getActivity(), getEvents(eventDate));
eventRecyclerView.setAdapter(mEventAdapter);
return view;
}
}
getEvents() 只是一个私有函数,用于返回给定日期的事件。我已经使用调试器和单元测试来验证它是否正常工作。调试器显示它为每个 Fragment 提取了正确的列表,但正如我解释的那样,它们没有正确显示。
这里是父Fragment的相关代码:
public class EventFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_event, container, false);
// Get and set up viewpager
final ViewPager viewPager = (ViewPager) view.findViewById(R.id.event_view_pager);
EventFragmentAdapter eventFragmentAdapter = new EventFragmentAdapter(getFragmentManager(), getEventDates());
viewPager.setAdapter(eventFragmentAdapter);
// Get and set up tablayout
final TabLayout tabLayout = (TabLayout) view.findViewById(R.id.event_tabs);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.post(new Runnable() {
@Override
public void run() {
tabLayout.setupWithViewPager(viewPager);
}
});
return view;
}
}
与上一个类似,getEventDates() 只是提取事件发生的日期。目前出于测试目的,我正在硬编码返回的日期列表,因为我们还没有设置我们的数据库。我退出这个方法是因为我希望应用能够在 2016 年再次运行,这可能有不同的日期:
private List<LocalDate> getEventDates(){
List<LocalDate> eventDates = new ArrayList<>();
eventDates.add(new LocalDate(2015, 10, 17));
eventDates.add(new LocalDate(2015, 10, 18));
return eventDates;
}
相关代码的最后一点是我用于 ViewPager 的 FragmentStatePagerAdapter:
public class EventFragmentAdapter extends FragmentStatePagerAdapter {
private List<LocalDate> mEventDates;
public EventFragmentAdapter(FragmentManager fragmentManager, List<LocalDate> eventDates){
super(fragmentManager);
this.mEventDates = eventDates;
}
@Override
public Fragment getItem(int i) {
return EventListFragment.newInstance(mEventDates.get(i));
}
@Override
public int getCount() {
return mEventDates.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mEventDates.get(position).dayOfWeek().getAsText();
}
}
任何想法为什么两个列表总是相同的,并且基于 ViewPager 中的最后一个选项卡?我假设他们以某种方式引用了相同的 RecyclerView 或相同的 RecyclerViewAdapter,但我没有任何静态字段,所以我不确定它是如何发生的。
【问题讨论】:
-
一切正常。你能告诉我们你的 getEventDates 代码吗?
-
您确定
getEvents()没有返回每个LocalDate的相同数据集吗?作为一个小测试,如果将ViewPager移到Activity上会发生什么? -
@RodrigoHenriques 用于测试目的,我刚刚硬编码了我返回的日期。我返回一个日期为 2015-10-17 和 2015-10-18 的
List<LocalDate>对象。我仍在研究一种稍后从数据库中提取这些事件的方法,因此该应用程序仍将适用于我们在 2016 年的事件。但它所做的就是返回这两个日期。 -
@Blackbelt 我已经使用调试器验证周六的片段返回计数为 2 的列表,而周日的返回计数为 0 的列表。ViewPager 不在 Activity 内部,而是在片段中,所以我不确定你的第二个问题是什么意思。
-
@McAdam331 你试过硬编码实例化这个片段吗?
标签: android android-fragments android-viewpager android-recyclerview