【问题标题】:How to update views of viewpager on swipe - android如何在滑动时更新 viewpager 的视图 - android
【发布时间】:2016-08-11 21:08:31
【问题描述】:

我正在使用 view-pager。我有三个选项卡:1. History,2. Main,3. Map。

我有秒表进入主要活动。当我按下开始,然后在该时间停止后,秒表的值添加到 sqlite 数据库中。在历史活动中,我从数据库中获取秒表的值并存储到列表视图中。效果很好。

但是现在我想在从 Main > History 滑动时更新 History 活动,所以在按下停止按钮后,我将最后一个值放入历史活动的列表视图中。

我的问题是how can I update the view on swipe the viewpager?

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

    }

}

}

【问题讨论】:

  • 请帮我解决我的问题。如果您的答案是解决我的问题,那么我肯定会接受并放弃投票。谢谢。

标签: android android-viewpager updates


【解决方案1】:

添加 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) {

        }
    });

【讨论】:

  • 根据 android 文档,不推荐使用这种方式:addOnPageChangeListener(ViewPager.OnPageChangeListener) 和 removeOnPageChangeListener(ViewPager.OnPageChangeListener)。
【解决方案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;
    }

【讨论】:

    【解决方案3】:

    获取一个字符串并将 Getter 和 setter 添加到您的 FragmentActivity 类中。

    喜欢……

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

    然后我们可以通过调用findFragmentByTag(<tag of target fragment>)从当前片段访问另一个片段。

    更多信息请查看链接Communication between Fragments in ViewPager

    【讨论】:

    【解决方案4】:

    您是否尝试过实现 OnPageChanged ?您可以捕捉用户何时开始滑动。

    执行pager.setOnPageChanged(new ....),Eclipse 将显示您可以覆盖的方法。 然后你可以覆盖onPageScrollStateChanged(int state)

    onPageScrollStateChanged(int state){
        if (state==OnPageChangeListener.SCROLL_STATE_DRAGGING){
           // update here
        }
    }
    

    【讨论】:

    • 谢谢,但是 eclipse 不给我setOnPageScrolledListener 的选项,
    • 您能否编辑我的代码以便更好地理解?我是安卓新手。请...
    • stateSCROLL_STATE_DRAGGING 是什么?
    • 谢谢,我知道你建议我覆盖方法。现在请你建议我如何更新视图?我可以通过 Intent 吗?还是其他方式?
    • 快速简单的方法是使用广播接收器。最佳实践是定义接口。查看官方教程:developer.android.com/training/basics/fragments/…
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多