我们都知道你不能这样做:
for (Object i : l) {
if (condition(i)) {
l.remove(i);
}
}
Run Code Online (Sandbox Code Playgroud)
ConcurrentModificationException等等......这显然有时起作用,但并非总是如此.这是一些特定的代码:
public static void main(String[] args) {
Collection<Integer> l = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
l.add(4);
l.add(5);
l.add(6);
}
for (int i : l) {
if (i == 5) {
l.remove(i);
}
}
System.out.println(l);
}
Run Code Online (Sandbox Code Playgroud)
当然,这会导致:
Exception in thread "main" java.util.ConcurrentModificationException
Run Code Online (Sandbox Code Playgroud)
...即使多线程没有这样做......无论如何.
什么是这个问题的最佳解决方案?如何在循环中从集合中删除项而不抛出此异常?
我也在Collection这里使用任意,不一定是ArrayList,所以你不能依赖get.
我正在设计一个包含多个页面的视图.我希望上一页和下一页的边缘显示如下,并实现双指滑动以在页面之间切换.

我尝试使用这里ViewPager建议的负页边距,但只显示屏幕上的一个边,而不是同时显示.
或者,有什么方法可以将我的视图的一部分放在屏幕外,然后设置它的动画,给它一个ViewPager类型效果.
我该怎么办呢?谢谢 !
Jon Willis发布了如何使用他的代码实现无限滚动.在那里,他说他在Android支持库的ViewPager类中进行了一些更改.已经进行了哪些更改以及如何使用ViewPager更改"重新编译"库?
我想将我的ViewPager设置为循环滚动.我希望第一页能够滚动到第2页和最后一页.我希望我的最后一页滚动到[最后一页-1]和第一页.我已经尝试了,虽然我不确定何时调用我创建的方法.在ViewPager中似乎没有一种方法可以处理这种事情,所以我创建了以下内容.
public ViewPagerAdapter(final ViewPager pager, int... pageIDs) {
super();
int actualNoOfIDs = pageIDs.length;
count = actualNoOfIDs + 2;
Log.d(TAG, "actualNoOfIDs: " + actualNoOfIDs +
"count: " + count);
pageIDsArray = new int[count];
for (int i = 0; i < actualNoOfIDs; i++) {
pageIDsArray[ i + 1] = pageIDs[i];
}
pageIDsArray[0] = pageIDs[actualNoOfIDs - 1];
pageIDsArray[count - 1] = pageIDs[0];
Log.d(TAG, "actualNoOfIDs#2: " + actualNoOfIDs +
"count#2: " + count);
pager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
int pageCount …Run Code Online (Sandbox Code Playgroud) 目标
构建一个循环ViewPager.
第一个元素允许您达到峰值到最后一个元素并向其滑动,反之亦然.您应该能够永远向任一方向滑动.
现在这已经完成,但这些问题对我的实现不起作用.以下是一些供参考:
我是如何尝试解决问题的
我们将使用大小为7的数组作为示例.要素如下:
[0][1][2][3][4][5][6]
Run Code Online (Sandbox Code Playgroud)
当你在元素0时,ViewPagers不允许你向左滑动!多么可怕:(.为了解决这个问题,我在正面和结尾添加了1个元素.
[0][1][2][3][4][5][6] // Original
[0][1][2][3][4][5][6][7][8] // New mapping
Run Code Online (Sandbox Code Playgroud)
当ViewPageAdapter请求(instantiateItem())元素0时,我们返回元素7.当ViewPageAdapter请求元素8时,我们返回元素1.
同样在ViewPager的OnPageChangeListener中,当使用0调用onPageSelected时,我们使用setCurrentItem(7),当使用8调用onPageSelected时,我们使用setCurrentItem(1).
这有效.
问题
当您从1向左滑动到0并且我们设置了CurrentItem(7)时,它将一直向右移动6个全屏幕.这并没有给出圆形ViewPager的外观,它给出了冲动到用户请求滑动动作的相反方向的最后一个元素的外观!
这非常非常刺耳.
我是如何试图解决这个问题的
我的第一个倾向是关闭平滑(即所有)动画.它有点好,但是当你从最后一个元素移动到第一个元素时,它现在变得不稳定,反之亦然.
然后我制作了自己的Scroller.
http://developer.android.com/reference/android/widget/Scroller.html
我发现在元素之间移动时始终有1次调用startScroll(),除非我从1移动到7和7移动到1.
第一个调用是方向和数量的正确动画.
第二个调用是将所有内容向右移动多个页面的动画.
这是事情变得非常棘手的地方.
我认为解决方案是跳过第二个动画.所以我做了.会发生一个平滑的动画,从1到7,有0个打嗝.完善!但是,如果你滑动,甚至点击屏幕,你会突然(没有动画)在元素6!如果你从7滑动到1,你实际上是在元素2.没有调用setCurrentItem(2)甚至调用OnPageChangeListener,表明你在任何时间点到达2.
但是你实际上并不是第2元,这有点好.您仍处于元素1,但将显示元素2的视图.然后当你向左滑动时,你会转到元素1.即使你已经真的在元素1上了......一些代码如何帮助清理:
动画被打破,但没有奇怪的副作用
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, duration);
}
Run Code Online (Sandbox Code Playgroud)
动画有效!但一切都很奇怪和可怕......
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
if (dx > 480 || dx < -480) …Run Code Online (Sandbox Code Playgroud) 我正在使用PagerAdapter进行水平滑动,以便在我的应用中显示报纸页面.
目前我想在这个应用程序中实现循环滚动.现在我所做的whenever I am getting on last page I try to set the currentItem to first page就是将最后一页的功能用于第一页,但问题是如何从第一页进入最后一页.在这里,我粘贴了与pagerAdapter和onPageChangeListener相关的代码: -
awesomeAdapter = new AwesomePagerAdapter(awesomePager);
awesomePager.setAdapter(awesomeAdapter);
awesomePager.setPageMargin(10);
awesomePager.setOnPageChangeListener(new OnPageChangeListener() {
int lastPosition;
float posOffset = 0;
@Override
public void onPageSelected(int position) {
viewerPage = position;
CommonLogic.logMessage("Viewer Page:- "+ viewerPage, TAG, Log.VERBOSE);
posOffset = 0;
}
@Override
public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
if (positionOffset == 0 && positionOffsetPixels == 0 && position != 0) {
lastPosition = position;
}
posOffset …Run Code Online (Sandbox Code Playgroud) 可能重复:
ViewPager为循环队列/包装
我的代码中有三个片段类.FirstActivity,SecondActivity,ThirdActivity我想刷这三个活动..这三个是从Fragment类扩展而来的
public class ViewPagerFragmentActivity extends FragmentActivity {
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
super.setContentView(R.layout.viewpager_layout);
initialisePaging();
}
/**
* Initialize the fragments to be paged
*/
List<Fragment> fragments = new Vector<Fragment>();
ViewPager pager;
private void initialisePaging() {
fragments.add(Fragment.instantiate(this, FirstActivity.class.getName()));
fragments.add(Fragment.instantiate(this, SecondActivity.class.getName()));
fragments.add(Fragment.instantiate(this, ThirdActivity.class.getName()));
this.mPagerAdapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments);
pager = (ViewPager) super.findViewById(R.id.viewpager);
pager.setAdapter(this.mPagerAdapter);
}
Run Code Online (Sandbox Code Playgroud)
}
这是我的FragmentPageAdapter类
public class MyPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragments;
public MyPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments …Run Code Online (Sandbox Code Playgroud) 如Google所述,Gallery类在API级别16中已弃用.不再支持此小部件.其他水平滚动小部件包括支持库中的HorizontalScrollView和ViewPager.所以我使用ViewPager作为Gallery类的替代品.
我的目标是最终实现带有文本描述的无限滚动图像ViewPager.我使用下面的代码来实现图像ViewPager,其中包含描述每个图像的文本但是如何将无限滚动应用于ViewPager?
我之前没有使用过ViewPager,请尽量提供详细的代码.
activity_main.xml中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/myimagepager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
custom_pager.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<ImageView
android:id="@+id/myimage"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_margin="5dp"
android:layout_weight="2" />
<TextView
android:id="@+id/image_text"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
ImagePager:
public class ImagePager extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImagePagerAdapter adapter = new ImagePagerAdapter(this, imageArra, stringArray );
ViewPager myPager = (ViewPager) findViewById(R.id.myimagepager);
myPager.setAdapter(adapter);
myPager.setCurrentItem(0);
}
private int imageArra[] = { R.drawable.a, R.drawable.b,R.drawable.c,
R.drawable.d,R.drawable.e,R.drawable.f,
R.drawable.g, …Run Code Online (Sandbox Code Playgroud) 我有一个ViewPager和一些视图.在最后一次右手划过后,我想去第一个.
我试过了
@Override
public Fragment getItem(int arg0) {
int i = arg0 % fragmentList.size();
return fragmentList.get(i);
}
@Override
public int getCount() {
return fragmentList.size()+1;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误
E/AndroidRuntime(22912): java.lang.IllegalStateException: Fragment already added: RubricFragment{4136cd80 #1 id=0x7f06000c android:switcher:2131099660:0}
Run Code Online (Sandbox Code Playgroud) Viewpager在Android中使用,是否可以以编程方式将任何页面移动到最后?例如,我有五页并希望将页面#2移动到最后一个位置(第五个位置),因此第3页变为2,4,变为3,5变为4?
谢谢
我有一个FragmentActivity来设置tabhost.每个选项卡都是一个名为TabFragment的简单片段.TabFragment有一个ViewPager,在这种情况下它是antonyt的InfiniteViewPager (在这里讨论:ViewPager作为循环队列/包装).
(主要)问题如下:
我启动了应用程序.我点击第二个标签.当我看到与第一个标签中相同的内容时,只有一个空白屏幕.向右滚动几次后,我看到了我的TextViews.
在ViewPagers中滚动片段并更改选项卡最终会导致停止和FC,并且不会抛出任何明确的异常.
这是我对Fragments的第一次采取,我必须承认,我不理解观察到的行为.
任何提示将不胜感激.
整个项目都在这里.
代码:
使用TabHost的FragmentActivity:
package com.example.viewpagerintab;
import java.util.HashMap;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.TabHost;
import android.widget.TabHost.TabContentFactory;
public class TabsFragmentActivity extends FragmentActivity implements
TabHost.OnTabChangeListener {
private TabHost mTabHost;
private HashMap mapTabInfo = new HashMap();
private TabInfo mLastTab = null;
public TabsFragmentActivity() {
}
private class TabInfo {
private String tag;
private Class clss;
private Bundle args;
private Fragment fragment;
TabInfo(String tag, …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager android-tabs android-nested-fragment
android ×10
java ×2
adapter ×1
android-tabs ×1
carousel ×1
collections ×1
iteration ×1
loops ×1
scroll ×1
viewanimator ×1
viewflipper ×1