对于多个选项卡单个片段不工作getItem被调用两次

时间:2017-06-07 14:02:40

标签: android android-fragments android-viewpager android-tabs

先生,我必须将单个片段用于多个标签。我已经使用 FragmentStatePagerAdapter 实现了它,但是在调试之后我得到了一些选项卡显示数据但不正确。这是因为 getItem被调用两次请尽早帮助我。

我从getItem传递了参数。它作为getItem调用两次传递参数两次。因此它会覆盖参数数据。我有6个选项卡,但只有1,3和5个选项卡显示数据,但数据是第2,4和第6个选项卡,第2,4和第6个选项卡在屏幕上没有显示任何内容。

以前的问题没有解决任何问题。

ViewPager代码

<html>
<head>
    <title>Test app</title>
    <style type="text/css">
        #fetch{
            position: absolute;
            text-align: center;
            left: 450px;
            top: 35px;
        }
    </style>
</head>
<body>

<form name="fetch-movie-title" id="fetch">
     <input type="text" placeholder="Enter a movie title" id="term" />
     <input type="submit" onclick="showdata()" id="search" value="Find me a poster" />
</form>

<script type="text/javascript">

function showdata() {
    var film = document.getElementById('term').value;
    console.log(film);

    var requestURL = "https://api.themoviedb.org/3/search/movie?api_key=<<api_key>>&language=en-US&query="+film+"&page=1&include_adult=false";

    var request = new XMLHttpRequest();

    request.open('GET', requestURL);

    request.responseType = 'json';

    request.send();

    request.onload = function(){
        var myjsondata = request.response; //request.response contains all our JSON data 

        console.log(myjsondata);
        var str = "<img src = 'https://image.tmdb.org/t/p/w500"+ myjsondata.results[0].poster_path+"'/>";
        console.log(str);
        document.write(str);
    } 

</script>
</body>
</html>

}

更改标签的监听器:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {

int TAB_COUNT=5;
Context mContext;
public ViewPagerAdapter(FragmentManager fm,Context context) {
    super(fm);
    mContext=context;
}

@Override
public Fragment getItem(int position) {
    NewsFragment fragment = new NewsFragment();
    Bundle args = new Bundle();
    args.putString("title", String.valueOf(getPageTitle(position)));
    args.putString("data", "data");
    fragment.setArguments(args);
    return fragment;

}

@Override
public CharSequence getPageTitle(int position) {

    return  mContext.getResources().getStringArray(R.array.tabs)[position];
}

@Override
public int getCount() {
    return TAB_COUNT;
}

适配器设置

@Override
public void onTabSelected(TabLayout.Tab tab) {
    viewPager.setCurrentItem(tab.getPosition());

}



@Override
public void onPageSelected(int position) {

    TabLayout.Tab tab = tabLayout.getTabAt(position);
    if (tab != null) {
        tab.select();
    }
}

1 个答案:

答案 0 :(得分:0)

每当适配器第一次创建新页面时,都会调用getItem。你看到它被调用两次的原因是viewPager提前准备下一页,所以如果你输入第1页,你也已经创建了第2页,以便在向右滑动时加快分页。

为了帮助您进一步向我们展示NewsFragment的代码。

此外,您可能会考虑使用FragmentPagerAdapter而不是FragmentStatePagerAdapter,因为您似乎有固定数量的选项卡(在您的示例中为5)并且根据文档是FragmentPagerAdapter的用例。

我在上面链接的页面中的文档:

  

当有一些通常更多的静态片段被分页时,这个版本的寻呼机最适合使用,例如一组标签。