java - Android ViewPager 未加载

标签 java android android-layout mobile

我正在尝试为锻炼日志创建日历(类似于 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;
            }

        }

    }

当您调用 FragmentStatePagerAdapternotifyDataSetChange() 方法时,它将调用此 getItemPosition(Object item)ViewPager 将重新加载其数据。

关于java - Android ViewPager 未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38387450/

相关文章:

java - 添加字段以筛选 : a boolean OR for Google App Engine?

java - 在 Android 上清除内部存储中的文件内容

android - 如何在android中为布局(顶部和底部)绘制两条水平线

android - 将 2 个 textview 并排放置,第二个 textview 始终可见

java - Jersey 安全文摘与基本身份验证

java - JpaRepository getOne() 获取并更新整个对象

java - 在 Java 中对字符串进行标记

Android 应用程序在连接到网络服务时崩溃

android - 有什么方法可以创建像 FacebookDialog.ShareDialogBu​​ilder 这样的 Twitter 共享对话框吗?

android - 删除 GridView 上的 FadingEdge。安卓 hive