为什么Viewpager实例化Item()在android中加载两次?
说明: 我正在根据列表的大小动态创建Viewpager 这是我的活动_main.xml为什么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
<?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);
}
}
});