【问题标题】:Android ViewPager not loadingAndroid ViewPager 未加载
【发布时间】:2016-07-15 03:34:00
【问题描述】:

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

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

非常详细的解释和帮助将不胜感激!我正在尝试自学应用程序开发,所以这对我来说都是全新的。

【问题讨论】:

  • 将activity_workout.xml中TextView中的android:layout_height="match_parent"替换为android:layout_height="wrap_content",希望对您有所帮助。
  • 请问,“正确加载”是什么意思?这意味着它加载了一半?您有任何错误消息(检查 logcat)吗?有什么异常行为?
  • @statosdotcom 对不起,我应该更清楚。基本上显示了 activity_workout.xml,但我的日期片段似乎都没有加载。
  • 谢谢@RameshKumar!

标签: java android android-layout mobile


【解决方案1】:

希望对你有所帮助。

试试这个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 将重新加载其数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多