ViewPager SetCurrentItem不设置位置被点击后 [英] ViewPager SetCurrentItem does not set the position after it is clicked

查看:207
本文介绍了ViewPager SetCurrentItem不设置位置被点击后的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 TouchImageView 加载以全屏显示图像,并有放大/捏能力。

的图像从网址通过Web服务拉动。响应是JSON。在这一部分,我用乱射+ GSON获得响应,并使用自定义适配器来填充寻呼机。

最初,图像示于列表视图。当用户单击一个项目,它会全屏显示所选择的项目。

不过,于我而言,这不会发生。无论位置用户选择,它仍然会显示图像索引0。

下面是我如何做到这一点:

在此适配器,用户会点击一个项目,它会通过在位置以另一个活动。

 公共类ItemPhotoAdapter延伸BaseAdapter {    私人的ArrayList< ItemImageModel> arrItemImage;    @覆盖
    公共ItemImageModel的getItem(int i)以{
        返回arrItemImage.get(ⅰ);
    }    ...    @覆盖
    公共查看getView(INT I,观景,ViewGroup中的ViewGroup){
        ViewHolder VH;
        LF =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        如果(查看== NULL){
            VH =新ViewHolder();
            鉴于= lf.inflate(R.layout.row_photo_grid,NULL);
            vh.item_image =(ImageView的)view.findViewById(R.id.img_item);            view.setTag(VH);
        }其他{
            VH =(ViewHolder)view.getTag();
        }
        ItemImageModel IIM = arrItemImage.get(I)        Picasso.with(上下文)//
                .load(iim.getResized())//
                .placeholder(R.drawable.placeholder)//
                .error(R.drawable.error)
                .into(vh.item_image);        vh.item_image.setOnClickListener(新OnImageClickListener(ⅰ));        返回视图。
    }    ...    私有类OnImageClickListener实现View.OnClickListener {
        INT _position;        公共OnImageClickListener(INT位置){
            this._position =位置;
        }        @覆盖
        公共无效的onClick(查看视图){
            意图I =新意图(背景下,PhotoGalleryActivity.class);
            i.putExtra(位置,_position);
            context.startActivity(ⅰ);        }
    }
}

PhotoGalleryActivity ,将加载的所有图像背面,但它不与用户选择的项目启动

 公共类PhotoGalleryActivity扩展FragmentActivity {    私人的ArrayList< ItemImageModel> arrItemImages;    ...    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_photo_gallery);        ViewPager mViewPager =(ViewPager)findViewById(R.id.pager);
        PB =(进度)findViewById(R.id.loading);        动作条动作条= getActionBar();
        actionBar.setDisplayHomeAsUpEnabled(真);        arrItemImages =新的ArrayList< ItemImageModel>();        意向I = getIntent();
        最终诠释位置= i.getIntExtra(位置,1);
        USER_ID = i.getStringExtra(user_ID的);
        ITEM_ID = i.getStringExtra(ITEM_ID);// Log.d(TAG,图像的位置:+位置);        mAdapter =新PhotoGalleryAdapter(arrItemImages,getApplicationContext(),这一点);        mViewPager.setAdapter(mAdapter);        mViewPager.setCurrentItem(位置);        // ViewPagerIndicator
        CirclePageIndicator titleIndicator =(CirclePageIndicator)findViewById(R.id.titles);
        titleIndicator.setViewPager(mViewPager);        loadPhotos();
    }    ...    私人无效loadPhotos(){
        mRequestQueue = Volley.newRequestQueue(本);        字符串URL = Constants.ITEM_DETAILS;        GsonRequest< ItemDetailContainer> myReq =新GsonRequest< ItemDetailContainer>(
                Request.Method.GET,网址,ItemDetailContainer.class,
                createMyReqSuccessListener(),createMyReqErrorListener());        mRequestQueue.add(myReq);
    }    ...
}


解决方案

我已经找到了解决方案。

要使用 SetCurrentItem 正确的,在这种情况下,我必须把它所有的图像加载后。例如。在 notifysetdatachanged

在排球响应监听功能,

 私人Response.Listener< ItemDetailContainer> createMyReqSuccessListener(){
    返回新Response.Listener< ItemDetailContainer>(){
        @覆盖
        公共无效onResponse(ItemDetailContainer响应){
            尝试{
                ...                mAdapter.notifyDataSetChanged();
                mViewPager.setCurrentItem(位置); // 这个
            }赶上(例外五){
                e.printStackTrace();
            }
        };
    };
}

I'm using TouchImageView to load images in full screen and have zoom/pinch capability.

The images are pulled from URL via a web service. The response is in JSON. At this part, I'm using Volley+GSON to obtain the response and use a custom adapter to populate the Pager.

Initially, the images are shown in a listview. When a user click an item, it will go full screen showing the chosen item.

However, in my case, this doesn't happen. Whatever position the user chose, it will still show the image at index 0.

Here is how I do it:

In this adapter, a user will click an item and it will pass the position to another activity.

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);

        }
    }
}

In PhotoGalleryActivity, will load all the images back, but it doesn't start with the item the user chose.

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);
    }

    ...
}

解决方案

I've found the solution.

To use SetCurrentItem correctly, in this case, I have to put it after all the images is loaded. Eg. after notifysetdatachanged.

In Volley response listener function,

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();
            }
        };
    };
}

这篇关于ViewPager SetCurrentItem不设置位置被点击后的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆