Android ViewPager无法加载 [英] Android ViewPager not loading

查看:71
本文介绍了Android ViewPager无法加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为锻炼日志创建日日历(类似于myfitnesspal的日历),并且在创建滑动日日历以跟踪我的日志时遇到了一些困难.我决定使用FragmentStatePagerAdapters和ViewPagers,但似乎无法正确加载ViewPagers.

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:

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:

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.

推荐答案

希望这对您有所帮助.

尝试此getItemPosition(Object item),进行任何更改时,它将加载ViewPager.

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

        }

    }

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

When you call notifyDataSetChange() method of FragmentStatePagerAdapter it will call this getItemPosition(Object item) and ViewPager will reload its data.

这篇关于Android ViewPager无法加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆