如何在Android中滑动ViewPager时更新视图

5

我正在使用view-pager,其中有三个标签:1.历史记录,2.主要内容,3.地图。

我在主要活动中使用秒表。当我按下开始按钮并在停止时,秒表的值将添加到SQLite数据库中。在历史记录活动中,我从数据库中获取秒表的值并存储到列表视图中。它运作得非常完美。

但是,现在我想在从主要 > 历史进行滑动后更新历史记录活动。因此,按下停止按钮后,我会在历史记录活动的列表视图中获得最后一个值。

我的问题是如何在滑动视图页面时更新视图?

public class SwipeyTabsSampleActivity extends FragmentActivity {

private static final String [] TITLES = {
    "HISTORY", 
    "MAIN",
    "MAP"  

};

private SwipeyTabs mTabs;
private ViewPager mViewPager;
//Handler handler=new Handler();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_swipeytab);

    mViewPager = (ViewPager) findViewById(R.id.viewpager);
    mTabs = (SwipeyTabs) findViewById(R.id.swipeytabs);

    SwipeyTabsPagerAdapter adapter = new SwipeyTabsPagerAdapter(this,
            getSupportFragmentManager());
    mViewPager.setAdapter(adapter);
    mTabs.setAdapter(adapter);
    mViewPager.setOnPageChangeListener(mTabs);
    mViewPager.setCurrentItem(1); 
    mViewPager.setOffscreenPageLimit(3);


}

 private class SwipeyTabsPagerAdapter extends FragmentPagerAdapter implements
        SwipeyTabsAdapter, ViewPager.OnPageChangeListener {

    private final Context mContext;
    ViewPager viewpager;



    public SwipeyTabsPagerAdapter(Context context, FragmentManager fm, ViewPager mViewPager) {
        super(fm);

        this.mContext = context;
        viewpager = mViewPager;

        //viewpager.setAdapter(this);
        viewpager.setOnPageChangeListener(this);

    }

    @Override
    public Fragment getItem(int position) {

         Fragment f = new Fragment();

        switch (position) {
        case 0:
            f = History.newInstance(position);

            break;
        case 1:
            f = Main.newInstance(position);
            break;
        case 2:
            f = Map.newInstance(position);

            break;

        }
        return f;

    }

    @Override
    public int getCount() {
        return TITLES.length;
    }


     @Override
        public void destroyItem(ViewGroup container, int position, Object object) {

            ViewPager pager = (ViewPager) container;
            View view = (View) object;

            pager.removeView(view);
        }



    public TextView getTab(final int position, SwipeyTabs root) {
        TextView view = (TextView) LayoutInflater.from(mContext).inflate(
                R.layout.swipey_tab_indicator, root, false);
        view.setText(TITLES[position]);
        view.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                mViewPager.setCurrentItem(position);

            }
        });

        return view;
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageSelected(int positiion) {
        // TODO Auto-generated method stub

    }

}

}

请帮我解决我的问题。如果您的答案解决了我的问题,我一定会接受并点赞。谢谢。 - user1584610
4个回答

9
在ViewPager中添加OnPageChangeListener:
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            // your code here
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

1
根据Android文档,此方法已被弃用,请使用addOnPageChangeListener(ViewPager.OnPageChangeListener)和removeOnPageChangeListener(ViewPager.OnPageChangeListener)代替。 - AndroLife

2
这将影响视图页面中从一个页面到另一个页面的更改。
OnPageChangeListener pagechangelistener =new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                Logger.logMessage("Called first");

                pageAdapter.notifyDataSetChanged();
                indicator.setCurrentItem(arg0);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {

                Logger.logMessage("Called second");

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

                Logger.logMessage("Called third");

            }
        };
        myViewPager.setOnPageChangeListener(pagechangelistener);

在您的页面适配器中使用这个。

@Override
    public int getItemPosition(Object object) {

        return POSITION_NONE;
    }

1
你尝试过实现OnPageChanged吗?你可以捕获用户开始滑动的时刻。
执行pager.setOnPageChanged(new....),Eclipse会显示你可以重写的方法。然后你就可以重写onPageScrollStateChanged(int state)了。
onPageScrollStateChanged(int state){
    if (state==OnPageChangeListener.SCROLL_STATE_DRAGGING){
       // update here
    }
}

谢谢,但是Eclipse没有为我提供“setOnPageScrolledListener”的选项。 - user1584610
请你能帮我修改一下我的代码,以便更好地理解?我对安卓开发还很陌生。拜托了... - user1584610
什么是 stateSCROLL_STATE_DRAGGING - user1584610
谢谢,我知道你建议我使用override方法。现在请问你能建议我如何更新视图吗? 我可以传递Intent吗?还是其他什么方式? - user1584610
快速简便的方法是使用BroadcastReceiver。最佳实践是定义接口。请查看官方教程:http://developer.android.com/training/basics/fragments/communicating.html - znat

1

将一个字符串添加到您的FragmentActivity类中,并添加Getters和Setters。

例如...

String HistoryFragment;

public String getHistoryFragment() {
    return HistoryFragment;
}


public void setHistoryFragment(String historyFragment) {
    HistoryFragment = historyFragment;
}

然后,我们可以通过调用findFragmentByTag(<目标片段的标签>)从当前片段访问另一个片段。

有关更多信息,请查看链接{{link1:ViewPager中片段之间的通信}}。


嘿,你能帮我看一下这个线程吗?http://stackoverflow.com/q/18097567/1503130 - Prateek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接