为什么Viewpager实例化Item()在android中加载两次?

为什么Viewpager实例化Item()在android中加载两次?,android,Android,说明: 我正在根据列表的大小动态创建Viewpager 这是我的活动_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_pa

说明: 我正在根据列表的大小动态创建Viewpager

这是我的活动_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.domore.viewpagerposition.MainActivity">

    <android.support.v4.view.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/pager_recent_matches"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:background="@android:color/transparent" />
</LinearLayout>
加载应用程序后,我尝试滑动并定位直接返回2

我的问题是为什么我在同一时间得到两个位置值???? 当我刷卡时,为什么我得到的是2而不是1


请帮助我解决此问题,因为ViewPager正在预加载页面以获得更平滑的动画。 要在当前页面之外加载的默认页面设置为1。 这意味着在启动时,它会加载默认值(0)和它旁边的值(1)。当您滑动到第一页时,它必须预加载它旁边的一页,位置为2

您可以使用
viewPager.setOffscreenPageLimit(数字)增加此值

最小值为1,这也是默认值

如果您只想获取当前位置,请在ViewPager上使用侦听器:

viewPager.setOnPageChangeListener(new OnPageChangeListener(){

  @Override
  public void onPageScrollStateChanged(int state) {
   // Called when the scroll state changes (scroll started - ended)
  }

  @Override
  public void onPageScrolled(int position, 
    float positionOffset, int positionOffsetPixels) {
   // This is called a lot of times when the user is scrolling
  }

  @Override
  public void onPageSelected(int position) {
      // Check position here to see which page was selected
  }
}); 

这是因为ViewPager正在预加载页面以获得更平滑的动画。 要在当前页面之外加载的默认页面设置为1。 这意味着在启动时,它会加载默认值(0)和它旁边的值(1)。当您滑动到第一页时,它必须预加载它旁边的一页,位置为2

您可以使用
viewPager.setOffscreenPageLimit(数字)增加此值

最小值为1,这也是默认值

如果您只想获取当前位置,请在ViewPager上使用侦听器:

viewPager.setOnPageChangeListener(new OnPageChangeListener(){

  @Override
  public void onPageScrollStateChanged(int state) {
   // Called when the scroll state changes (scroll started - ended)
  }

  @Override
  public void onPageScrolled(int position, 
    float positionOffset, int positionOffsetPixels) {
   // This is called a lot of times when the user is scrolling
  }

  @Override
  public void onPageSelected(int position) {
      // Check position here to see which page was selected
  }
}); 

根据丹尼尔·佐尔奈的回答,他是绝对正确的。 在这里,我找到了一个完美的解决方案

将另一个列表从homefragment传递到适配器,如下所示:

List<String> list=new ArrayList<>();

//Now, add the elements to the newly created list

list.add("notstarted");
list.add("started");
list.add("started");
list.add("notstarted");

//Add into adapter constructor parameter
adapter=new LiveAdapter(this,lst,list);

不要忘记将您的位置参数设置为instanceItem()方法参数的final。

根据@Daniel Zolnai的回答,他是绝对正确的。 在这里,我找到了一个完美的解决方案

将另一个列表从homefragment传递到适配器,如下所示:

List<String> list=new ArrayList<>();

//Now, add the elements to the newly created list

list.add("notstarted");
list.add("started");
list.add("started");
list.add("notstarted");

//Add into adapter constructor parameter
adapter=new LiveAdapter(this,lst,list);


不要忘记将您的位置参数设置为instanceItem()的final方法参数。

尝试此代码,请给出有效答案。启动视图上显示的文本后,添加您的活动\u main.xml。实际上,我没有在视图上设置任何数据,但如果我在文本视图上设置位置,则我得到了四个viewpager,我得到了完美的位置,如第一个0,第二个1,第三个是2,第四个是3。你的问题只是日志吗?内容是否正确显示?请尝试此代码并给出有效答案。在启动视图上显示的文本后,添加您的activity_main.xml。实际上,我没有在视图上设置任何数据,但如果我在textview上设置位置,则我得到了四个viewpager,我得到了一个完美的位置,如第一个0,第二个1,第三个是2,第四个是3。你的问题只是日志吗?内容是否正确显示?如何避免此问题?这不是问题,这是viewpager的工作方式。试一试,你不明白viewpager是怎么工作的。正如我所说,你不应该在那里检查位置,而是使用OnPageChangeListener。我理解,但根据你最后的评论。如果我单击viewpager,那么我需要将代码放在哪里??你只需将位置参数设置为final,然后检查该位置。我如何避免这个问题?这不是问题,这就是viewpager的工作原理。试一试,你不明白viewpager是怎么工作的。正如我所说,你不应该在那里检查位置,而应该使用OnPageChangeListener。我理解,但根据你最后的评论。如果我单击viewpager,那么我需要将代码放在哪里??你只需将位置参数设为final,然后检查该位置。
List<String> list=new ArrayList<>();

//Now, add the elements to the newly created list

list.add("notstarted");
list.add("started");
list.add("started");
list.add("notstarted");

//Add into adapter constructor parameter
adapter=new LiveAdapter(this,lst,list);
public LiveAdapter(Context context,List<JSONObject> lst,int pagerLength,List<String> list_status){
        this.context=context;
        this.lst=lst;
        this.list_status=list_status;
        this.pagerLength=pagerLength;
        inflater=(LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String status_value=list_status.get(position);
                if(status_value.equals("notstarted")){
                    Log.e("status",""+status_value);
                    Intent intent=new Intent(context,NotStartedMatchDetails.class);
                    context.startActivity(intent);
                }
            }
        });