我正在使用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);
}
...
}
答案 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);
}