2016-07-15 10 views
1

Ich versuche, einen Tageskalender für ein Trainingsprotokoll (ähnlich dem von myfitnesspal) zu erstellen, und ich habe Schwierigkeiten, einen Wischkalender zu erstellen, um meine Logs zu verfolgen. Ich entschied mich dafür, FragmentStatePagerAdapters und ViewPagers zu verwenden und ich kann nicht scheinen, die ViewPagers richtig zu laden.Android ViewPager wird nicht geladen

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." 
    /> 

Sehr detaillierte Erklärung und Hilfe würde sehr geschätzt werden! Ich versuche, mir App-Entwicklung beizubringen, das ist alles sehr neu für mich.

+0

Ersetzen Sie Ihr Android: layout_height = "match_parent" in TextView in activity_workout.xml zu android: layout_height = "wrap_content", hoffe dies hilft. –

+0

Entschuldigung, was meinst du mit "richtig geladen"? Es bedeutet, dass es um die Hälfte lädt? Haben Sie eine Fehlermeldung (überprüfen Sie logcat)? Ein abnormales Verhalten? – statosdotcom

+0

@statosdotcom Tut mir leid, ich hätte klarer sein sollen. Grundsätzlich wird activity_workout.xml angezeigt, aber keines meiner Datumsfragmente scheint geladen zu werden. –

Antwort

1

Hoffe das hilft dir.

Versuchen Sie diese getItemPosition(Object item), Es lädt Ihren ViewPager, wenn Sie Änderungen vornehmen.

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; 
      } 

     } 

    } 

Wenn Sie notifyDataSetChange() Methode von FragmentStatePagerAdapter nennen es nennen dies getItemPosition(Object item) und ViewPager seine Daten neu zu laden.