我正在尝试为锻炼日志创建日历(类似于 myfitnesspal 的日历),但在创建滑动日历来跟踪我的日志时遇到了一些困难。我决定使用 FragmentStatePagerAdapters 和 ViewPagers,但我似乎无法正确加载 ViewPagers。
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."
/>
非常详细的解释和帮助将不胜感激!我正在尝试自学应用程序开发,所以这对我来说都是全新的。
最佳答案
希望对你有帮助。
试试这个 getItemPosition(Object item)
,它会在您进行任何更改时加载您的 ViewPager。
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;
}
}
}
当您调用 FragmentStatePagerAdapter
的 notifyDataSetChange()
方法时,它将调用此 getItemPosition(Object item)
和 ViewPager
将重新加载其数据。
关于java - Android ViewPager 未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38387450/