Ada*_*331 7 android android-fragments android-viewpager android-recyclerview
我有一个包含RecyclerView的Fragment来显示给定日期的事件.我使用ViewPager将片段分成多天; 周六活动的片段和周日活动的片段.
但是,看起来两个片段都引用相同的RecyclerView和/或Adapter,因为它只是显示其事件的最后一个选项卡(在本例中为Sunday).
在我的具体案例中,星期六有两个事件,周日没有事件.两个片段都有空的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;
}
}
Run Code Online (Sandbox Code Playgroud)
getEvents()只是一个私有函数,用于返回给定日期的事件.我已经使用调试器以及单元测试来验证它是否正常工作.调试器显示它为每个片段提取了正确的列表,但正如我所解释的那样,它们没有正确显示.
以下是父片段的相关代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
与上一个类似,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;
}
Run Code Online (Sandbox Code Playgroud)
最后一点相关代码是我用于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();
}
}
Run Code Online (Sandbox Code Playgroud)
任何想法为什么两个列表总是相同,并基于ViewPager中的最后一个选项卡?我假设他们以某种方式引用相同的RecyclerView或相同的RecyclerViewAdapter,但我没有任何静态字段,因此我不确定它是如何发生的.
Tre*_*ers 16
长期捕猎和反高潮解决方案(与最困难的错误一样).也有点不公平,因为错误不在上面发布的代码中,我不得不追捕你的git项目来搞清楚.错误发生在EventAdapter:
public class EventAdapter extends RecyclerView.Adapter<EventAdapter.ViewHolder> {
private static final List<Event> mEvents;
private final Context mContext;
public EventAdapter(Context context, List<Event> events){
this.mContext = context;
mEvents = events;
}
...
}
Run Code Online (Sandbox Code Playgroud)
mEvents是静态的!...所以它在所有实例中共享mEvents.这完全解释了错误,因为最后更新它将为所有错误设置值EventAdapters.
看起来你是mEvents静态的,所以你可以在你的内部访问它ViewHolders.相反,您可以将单个事件存储在其中ViewHolder并删除危险的静态修改器.另一方面,开源项目万岁!
| 归档时间: |
|
| 查看次数: |
3431 次 |
| 最近记录: |