ViewPager 片段都引用相同的 RecyclerView and/or 适配器
ViewPager fragments are all referencing the same RecyclerView and/or Adapter
我有一个包含 RecyclerView 的 Fragment 来显示给定日期的事件。我正在使用 ViewPager 将片段分成多天;周六活动的片段和周日活动的片段。
但是,两个片段似乎都引用了同一个 RecyclerView and/or 适配器,因为它只是显示事件的最后一个选项卡(在本例中为星期日)。
在我的具体情况下,周六有两个事件,周日没有事件。两个片段都有空的 RecyclerView。为了证实我的理论,它是由最后一个标签引起的,我切换了日期。这导致两个 RecyclerView 都有两个事件(星期六的事件)。
这里是各个片段的相关代码:
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()
只是给定日期的 return 事件的私有函数。我已经使用调试器和单元测试来验证它是否正常工作。调试器显示它为每个片段提取了正确的列表,但正如我所解释的那样,它们显示不正确。
父片段的相关代码如下:
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()
只是提取事件发生的日期。目前出于测试目的,我正在硬编码 returned 日期列表,因为我们还没有设置数据库。我取消了这个方法,因为我希望应用程序能够在 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,但我没有任何静态字段,所以我不确定它是如何发生的。
你能试试这个吗?
public class EventFragmentAdapter extends FragmentStatePagerAdapter {
private List<LocalDate> mEventDates;
private List<EventListFragment> mFragments;
public EventFragmentAdapter(FragmentManager fragmentManager, List<LocalDate> eventDates){
super(fragmentManager);
this.mEventDates = eventDates;
this.mFragments = new ArrayList<>;
for (LocalDate date : this.mEventDates) {
this.mFragments.add(EventListFragment.newInstance(date));
}
}
@Override
public Fragment getItem(int i) {
return mFragments.get(i);
}
@Override
public int getCount() {
return mEventDates.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mEventDates.get(position).dayOfWeek().getAsText();
}
}
然后检查mFragents的每一项是否有预期的内容。
漫长的寻找和反高潮的解决方案(与最困难的错误一样)。也有点不公平,因为错误不在上面发布的代码中,我不得不寻找你的 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;
}
...
}
mEvents
是静态的!...所以它在 mEvents
的所有实例之间共享。这完美地解释了这个错误,因为最后更新它会设置所有 EventAdapters
.
的值
您似乎将 mEvents
设为静态,以便您可以在 ViewHolders
中访问它。相反,您可以只将单个事件存储在 ViewHolder
中并删除 dangerous static 修饰符。另一方面,开源项目万岁!
我看过你的代码,我完全同意 Travor 的观点——你使用的是静态成员,每次你创建新的适配器时都会替换它(因此它只获取最后一页数据)。我对您的项目做了一些修改,以使其正常工作。看看吧,希望对你有用
EventFragment:将 getFragmentManager 替换为 getChildFragmentManager,因为您需要 EventListFragment 由 EventFragment 片段管理器处理,而不是由 activity 片段管理器
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(getChildFragmentManager(), 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;
}
/**
* Retrieves the event dates for the hackathon so that the proper events can be displayed.
* @return
*/
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;
}
}
EventListFragment - 我修改了查询,因为 sqlite 查询不适用于我的语言环境(意大利语)
public class EventListFragment extends Fragment{
private EventAdapter mEventAdapter;
private static final String TAG = EventListFragment.class.getSimpleName();
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(getEvents(eventDate));
eventRecyclerView.setAdapter(mEventAdapter);
Log.v(TAG, eventRecyclerView.toString());
return view;
}
/**
* Retrieves the events for the given date for the fragment.
*/
private List<Event> getEvents(LocalDate date){
List<Event> returnList = new ArrayList<>();
String dateString = Utility.getDBDateString(date);
List<String> dateList = new ArrayList<>();
Cursor cursor = getActivity().getContentResolver().query(
GHContract.EventEntry.CONTENT_URI,
new String[]{ "*", "substr(" + GHContract.EventEntry.COLUMN_TIME + ",0,11)" },
"substr(" + GHContract.EventEntry.COLUMN_TIME + ",0,11) = ? ",
new String[]{dateString},
GHContract.EventEntry.COLUMN_TIME
);
while(cursor.moveToNext()){
returnList.add(new Event(cursor));
dateList.add(cursor.getString(cursor.getColumnIndex(GHContract.EventEntry.COLUMN_TIME)));
}
cursor.close();
return returnList;
}
}
EventAdapter - 删除了静态关键字和对 activity 上下文的引用(您需要在其他地方获取上下文)
public class EventAdapter extends RecyclerView.Adapter<EventAdapter.ViewHolder> {
private List<Event> mEvents;
public EventAdapter(List<Event> events){
mEvents = events;
}
/**
* Inflates the view for Event items.
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_event, parent, false);
return new ViewHolder(view);
}
/**
* Binds the data for an event to its view.
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Event event = mEvents.get(position);
holder.timeView.setText(Utility.getTimeString(event.getTime()));
holder.titleView.setText(event.getTitle());
holder.locationView.setText(event.getLocation());
// If reminder time is not null, show check mark. If it is, show plus.
if(event.getReminderTime() != null){
holder.alarmView.setImageDrawable(holder.itemView.getResources().getDrawable(R.drawable.ic_alarm_on));
} else{
holder.alarmView.setImageDrawable(holder.itemView.getResources().getDrawable(R.drawable.ic_add_alarm));
}
}
/**
* Returns the size of the adapter.
*/
@Override
public int getItemCount() {
return mEvents.size();
}
/**
* Retains a reference to the view so `findViewById` calls are only made once for the adapter.
*/
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public final TextView timeView;
public final TextView titleView;
public final TextView locationView;
public final ImageView alarmView;
public ViewHolder(View view){
super(view);
timeView = (TextView) view.findViewById(R.id.event_time);
titleView = (TextView) view.findViewById(R.id.event_title);
locationView = (TextView) view.findViewById(R.id.event_location);
alarmView = (ImageView) view.findViewById(R.id.event_add_reminder);
alarmView.setOnClickListener(this);
}
/**
* Handles the click a user makes on the alarm image view.
*/
@Override
public void onClick(View v) {
OnEventReminderClickListener activity = (OnEventReminderClickListener) v.getContext();
activity.onEventReminderClicked(mEvents.get(getPosition()));
}
}
/**
* Interface to call back to the activity when an alarm is clicked for an event item.
*/
public interface OnEventReminderClickListener{
void onEventReminderClicked(Event event);
}
}
最后是 app/build.gradle,因为您需要为所有支持库(回收器、卡片等)获取相同的版本
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.adammcneilly.grizzhacks"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'joda-time:joda-time:2.7'
compile 'com.android.support:recyclerview-v7:22.2.1'
compile 'com.android.support:cardview-v7:22.2.1'
compile 'com.android.support:design:22.2.1'
}
我有一个包含 RecyclerView 的 Fragment 来显示给定日期的事件。我正在使用 ViewPager 将片段分成多天;周六活动的片段和周日活动的片段。
但是,两个片段似乎都引用了同一个 RecyclerView and/or 适配器,因为它只是显示事件的最后一个选项卡(在本例中为星期日)。
在我的具体情况下,周六有两个事件,周日没有事件。两个片段都有空的 RecyclerView。为了证实我的理论,它是由最后一个标签引起的,我切换了日期。这导致两个 RecyclerView 都有两个事件(星期六的事件)。
这里是各个片段的相关代码:
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()
只是给定日期的 return 事件的私有函数。我已经使用调试器和单元测试来验证它是否正常工作。调试器显示它为每个片段提取了正确的列表,但正如我所解释的那样,它们显示不正确。
父片段的相关代码如下:
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()
只是提取事件发生的日期。目前出于测试目的,我正在硬编码 returned 日期列表,因为我们还没有设置数据库。我取消了这个方法,因为我希望应用程序能够在 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,但我没有任何静态字段,所以我不确定它是如何发生的。
你能试试这个吗?
public class EventFragmentAdapter extends FragmentStatePagerAdapter {
private List<LocalDate> mEventDates;
private List<EventListFragment> mFragments;
public EventFragmentAdapter(FragmentManager fragmentManager, List<LocalDate> eventDates){
super(fragmentManager);
this.mEventDates = eventDates;
this.mFragments = new ArrayList<>;
for (LocalDate date : this.mEventDates) {
this.mFragments.add(EventListFragment.newInstance(date));
}
}
@Override
public Fragment getItem(int i) {
return mFragments.get(i);
}
@Override
public int getCount() {
return mEventDates.size();
}
@Override
public CharSequence getPageTitle(int position) {
return mEventDates.get(position).dayOfWeek().getAsText();
}
}
然后检查mFragents的每一项是否有预期的内容。
漫长的寻找和反高潮的解决方案(与最困难的错误一样)。也有点不公平,因为错误不在上面发布的代码中,我不得不寻找你的 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;
}
...
}
mEvents
是静态的!...所以它在 mEvents
的所有实例之间共享。这完美地解释了这个错误,因为最后更新它会设置所有 EventAdapters
.
您似乎将 mEvents
设为静态,以便您可以在 ViewHolders
中访问它。相反,您可以只将单个事件存储在 ViewHolder
中并删除 dangerous static 修饰符。另一方面,开源项目万岁!
我看过你的代码,我完全同意 Travor 的观点——你使用的是静态成员,每次你创建新的适配器时都会替换它(因此它只获取最后一页数据)。我对您的项目做了一些修改,以使其正常工作。看看吧,希望对你有用
EventFragment:将 getFragmentManager 替换为 getChildFragmentManager,因为您需要 EventListFragment 由 EventFragment 片段管理器处理,而不是由 activity 片段管理器
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(getChildFragmentManager(), 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;
}
/**
* Retrieves the event dates for the hackathon so that the proper events can be displayed.
* @return
*/
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;
}
}
EventListFragment - 我修改了查询,因为 sqlite 查询不适用于我的语言环境(意大利语)
public class EventListFragment extends Fragment{
private EventAdapter mEventAdapter;
private static final String TAG = EventListFragment.class.getSimpleName();
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(getEvents(eventDate));
eventRecyclerView.setAdapter(mEventAdapter);
Log.v(TAG, eventRecyclerView.toString());
return view;
}
/**
* Retrieves the events for the given date for the fragment.
*/
private List<Event> getEvents(LocalDate date){
List<Event> returnList = new ArrayList<>();
String dateString = Utility.getDBDateString(date);
List<String> dateList = new ArrayList<>();
Cursor cursor = getActivity().getContentResolver().query(
GHContract.EventEntry.CONTENT_URI,
new String[]{ "*", "substr(" + GHContract.EventEntry.COLUMN_TIME + ",0,11)" },
"substr(" + GHContract.EventEntry.COLUMN_TIME + ",0,11) = ? ",
new String[]{dateString},
GHContract.EventEntry.COLUMN_TIME
);
while(cursor.moveToNext()){
returnList.add(new Event(cursor));
dateList.add(cursor.getString(cursor.getColumnIndex(GHContract.EventEntry.COLUMN_TIME)));
}
cursor.close();
return returnList;
}
}
EventAdapter - 删除了静态关键字和对 activity 上下文的引用(您需要在其他地方获取上下文)
public class EventAdapter extends RecyclerView.Adapter<EventAdapter.ViewHolder> {
private List<Event> mEvents;
public EventAdapter(List<Event> events){
mEvents = events;
}
/**
* Inflates the view for Event items.
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_event, parent, false);
return new ViewHolder(view);
}
/**
* Binds the data for an event to its view.
*/
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Event event = mEvents.get(position);
holder.timeView.setText(Utility.getTimeString(event.getTime()));
holder.titleView.setText(event.getTitle());
holder.locationView.setText(event.getLocation());
// If reminder time is not null, show check mark. If it is, show plus.
if(event.getReminderTime() != null){
holder.alarmView.setImageDrawable(holder.itemView.getResources().getDrawable(R.drawable.ic_alarm_on));
} else{
holder.alarmView.setImageDrawable(holder.itemView.getResources().getDrawable(R.drawable.ic_add_alarm));
}
}
/**
* Returns the size of the adapter.
*/
@Override
public int getItemCount() {
return mEvents.size();
}
/**
* Retains a reference to the view so `findViewById` calls are only made once for the adapter.
*/
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
public final TextView timeView;
public final TextView titleView;
public final TextView locationView;
public final ImageView alarmView;
public ViewHolder(View view){
super(view);
timeView = (TextView) view.findViewById(R.id.event_time);
titleView = (TextView) view.findViewById(R.id.event_title);
locationView = (TextView) view.findViewById(R.id.event_location);
alarmView = (ImageView) view.findViewById(R.id.event_add_reminder);
alarmView.setOnClickListener(this);
}
/**
* Handles the click a user makes on the alarm image view.
*/
@Override
public void onClick(View v) {
OnEventReminderClickListener activity = (OnEventReminderClickListener) v.getContext();
activity.onEventReminderClicked(mEvents.get(getPosition()));
}
}
/**
* Interface to call back to the activity when an alarm is clicked for an event item.
*/
public interface OnEventReminderClickListener{
void onEventReminderClicked(Event event);
}
}
最后是 app/build.gradle,因为您需要为所有支持库(回收器、卡片等)获取相同的版本
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.adammcneilly.grizzhacks"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'joda-time:joda-time:2.7'
compile 'com.android.support:recyclerview-v7:22.2.1'
compile 'com.android.support:cardview-v7:22.2.1'
compile 'com.android.support:design:22.2.1'
}