ViewPager SetCurrentItem在被点击后无法设置位置

3
我正在使用 TouchImageView 在全屏幕中加载图像,并具备缩放/捏合能力。
这些图像是通过Web服务从URL获取的。响应以JSON格式返回。在此部分中,我正在使用Volley + GSON获取响应并使用自定义适配器填充Pager。
最初,这些图像是显示在ListView中的。当用户点击某个项目时,它将全屏显示所选项目。
然而,在我的情况下,这并没有发生。无论用户选择哪个位置,它都会显示索引0处的图像。
以下是我的操作方法:
在该适配器中,用户将单击项目,并将位置传递给另一个活动。
public class ItemPhotoAdapter extends BaseAdapter {

    private ArrayList<ItemImageModel> arrItemImage;

    @Override
    public ItemImageModel getItem(int i) {
        return arrItemImage.get(i);
    }

    ...

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder vh;
        lf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(view == null){
            vh = new ViewHolder();
            view = lf.inflate(R.layout.row_photo_grid, null);
            vh.item_image = (ImageView) view.findViewById(R.id.img_item);

            view.setTag(vh);
        } else {
            vh = (ViewHolder) view.getTag();
        }


        ItemImageModel iim = arrItemImage.get(i);

        Picasso.with(context) //
                .load(iim.getResized()) //
                .placeholder(R.drawable.placeholder) //
                .error(R.drawable.error)
                .into(vh.item_image);

        vh.item_image.setOnClickListener(new OnImageClickListener(i));

        return view;
    }

    ...

    private class OnImageClickListener implements View.OnClickListener {
        int _position;

        public OnImageClickListener(int position) {
            this._position = position;
        }

        @Override
        public void onClick(View view) {
            Intent i = new Intent(context, PhotoGalleryActivity.class);
            i.putExtra("position", _position);
            context.startActivity(i);

        }
    }
}

PhotoGalleryActivity中,将会加载所有的图片,但不会从用户选择的项目开始。
public class PhotoGalleryActivity extends FragmentActivity {

    private ArrayList<ItemImageModel> arrItemImages;

    ...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_photo_gallery);

        ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
        pb = (ProgressBar) findViewById(R.id.loading);

        ActionBar actionBar = getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);

        arrItemImages = new ArrayList<ItemImageModel>();

        Intent i = getIntent();
        final int position = i.getIntExtra("position", 1);
        user_id = i.getStringExtra("user_id");
        item_id = i.getStringExtra("item_id");

//        Log.d(TAG, "Image position: " + position);

        mAdapter = new PhotoGalleryAdapter(arrItemImages, getApplicationContext(), this);

        mViewPager.setAdapter(mAdapter);

        mViewPager.setCurrentItem(position);

        // ViewPagerIndicator
        CirclePageIndicator titleIndicator = (CirclePageIndicator)findViewById(R.id.titles);
        titleIndicator.setViewPager(mViewPager);

        loadPhotos();
    }

    ...

    private void loadPhotos() {
        mRequestQueue = Volley.newRequestQueue(this);

        String url = Constants.ITEM_DETAILS;

        GsonRequest<ItemDetailContainer> myReq = new GsonRequest<ItemDetailContainer>(
                Request.Method.GET, url, ItemDetailContainer.class,
                createMyReqSuccessListener(), createMyReqErrorListener());

        mRequestQueue.add(myReq);
    }

    ...
}
2个回答

5
我找到了解决方案。
要正确使用SetCurrentItem,在这种情况下,我必须在所有图像加载完成后才能将其放置。例如,在notifysetdatachanged之后。
在Volley响应监听器函数中,
private Response.Listener<ItemDetailContainer> createMyReqSuccessListener() {
    return new Response.Listener<ItemDetailContainer>() {
        @Override
        public void onResponse(ItemDetailContainer response) {
            try {
                ...

                mAdapter.notifyDataSetChanged();
                mViewPager.setCurrentItem(position); // this
            } catch (Exception e) {
                e.printStackTrace();
            }
        };
    };
}

我需要在onCreateView中创建ViewPager,然后紧接着调用setCurrentItem()。这怎么可能实现? - LeoSarena

0
如果您想在屏幕旋转时保留选项卡索引,可以先将该值保存到成员变量中:
if (savedInstanceState != null) {
    mLastTabIndex = savedInstanceState.getInt(KEY_TAB_INDEX, 0);
} else {
    mLastTabIndex = -1;
}

只有在选项卡数据加载到选项卡适配器后,您才会检查成员变量并设置当前选项卡索引(如果存在):

mPostTypes = result.getTypes();

mAdapter.notifyDataSetChanged();
if (mLastTabIndex > 0) {
    mViewPager.setCurrentItem(mLastTabIndex);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接