ViewPager SetCurrentItem在单击后不设置位置

时间:2014-02-28 09:40:33

标签: android android-viewpager

我正在使用TouchImageView以全屏加载图片并具有缩放/缩放功能。

通过网络服务从网址中提取图片。响应是JSON。在这一部分,我使用Volley + GSON获取响应并使用自定义适配器来填充寻呼机。

最初,图像以列表视图显示。当用户点击某个项目时,它将全屏显示所选项目。

然而,在我的情况下,这不会发生。无论用户选择何种位置,它仍将在索引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 个答案:

答案 0 :(得分: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();
            }
        };
    };
}

答案 1 :(得分: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);
}