问题
I'm trying to create a day calendar for a workout log (similar to that of myfitnesspal) and I'm having some difficulty creating a swiping day calendar to track my logs. I decided to use FragmentStatePagerAdapters and ViewPagers and I can't seem to get the ViewPagers to load properly.
package me.thomasdkim.fitit.workout;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import me.thomasdkim.fitit.R;
public class Workout extends AppCompatActivity {
ViewPager myView;
DateFragmentAdapter mDateFragmentAdapter;
DateFragment[] dateFragmentArray;
@Override
protected void onCreate(Bundle savedInstanceState) {
System.out.println("The app is being created.");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_workout);
/* Declare variablees */
Calendar yesterday, today, tomorrow;
yesterday = Calendar.getInstance();
today = Calendar.getInstance();
tomorrow = Calendar.getInstance();
dateFragmentArray = new DateFragment[3];
yesterday.add(Calendar.DAY_OF_MONTH, -1); //Set the date of yesterday to the day before
tomorrow.add(Calendar.DAY_OF_MONTH, 1); //Set the date of tomorrow to the day after
dateFragmentArray[0] = DateFragment.newInstance(yesterday);
dateFragmentArray[1] = DateFragment.newInstance(today);
dateFragmentArray[2] = DateFragment.newInstance(tomorrow);
myView = (ViewPager) findViewById(R.id.pager);
mDateFragmentAdapter = new DateFragmentAdapter(getSupportFragmentManager(), dateFragmentArray);
myView.setAdapter(mDateFragmentAdapter);
myView.setCurrentItem(1);
}
@Override
public void onBackPressed() {
if (myView.getCurrentItem() == 0) {
// If the user is currently looking at the first step, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
} else {
// Otherwise, select the previous step.
myView.setCurrentItem(myView.getCurrentItem() - 1);
}
}
public static class DateFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
System.out.println("OnCreateView is created.");
View rootView = inflater.inflate(R.layout.slide_date_fragment,container, false);
View newText = (TextView) rootView.findViewById(R.id.datefrag);
if(getArguments().getString("date") != null) {
System.out.println("THE ARGUMENT HAS A DATE");
((TextView)newText).setText(getArguments().getString("date"));
System.out.println("DATE IS " + getArguments().getString("date"));
}
return rootView;
}
public static DateFragment newInstance(Calendar cal) {
System.out.println("newInstance activated");
//Create new date fragment object
DateFragment newFrag = new DateFragment();
//Create new Bundle to store aarguments
Bundle args = new Bundle();
//Set a "date" paramater the the object
args.putString("date", dateToString(cal));
newFrag.setArguments(args); //Set the argument to the newly created date fragment
return newFrag;
}
}
public static class DateFragmentAdapter extends FragmentStatePagerAdapter{
DateFragment[] fragList;
int fragNum;
public DateFragmentAdapter(FragmentManager fm, DateFragment[] fragList) {
super(fm);
this.fragNum = 3;
this.fragList = fragList;
}
@Override
public DateFragment getItem(int position) {
return this.fragList[position];
}
@Override
public int getCount() {
return this.fragNum;
}
}
public static String dateToString(Calendar cal){
String dateString;
dateString = cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.DAY_OF_MONTH) + "/" +
+ cal.get(Calendar.YEAR);
return dateString;
}
}
activity_workout.xml:
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="This is the activity_workout screeen."
/>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager">
</android.support.v4.view.ViewPager>
slide_date_fragment.xml:
<!-- fragment_screen_slide_page.xml -->
<TextView style="?android:textAppearanceMedium"
android:padding="16dp"
android:lineSpacingMultiplier="1.2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:id="@+id/datefrag"
android:text="slide date fragment."
/>
Very detailed explanation and help would be very much appreciated! I'm trying to teach myself app development so this is all very new to me.
回答1:
Hope this helps you.
Try this getItemPosition(Object item), It will load your ViewPager when you make any change.
public class DrawerPager extends FragmentStatePagerAdapter {
List<Drawer> drawers;
Drawer appDraw;
public DrawerPager(FragmentManager fm,
List<Drawer> drawers) {
super(fm);
this.drawers= drawers;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return drawers.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return drawers.size();
}
@Override
public int getItemPosition(Object item) {
appDraw = (AppDrawer) item;
if (pg >= 0) {
return POSITION_NONE;
} else {
return pg;
}
}
}
When you call notifyDataSetChange() method of FragmentStatePagerAdapter it will call this getItemPosition(Object item) and ViewPager will reload its data.
来源:https://stackoverflow.com/questions/38387450/android-viewpager-not-loading