2012-02-20 10 views
0

自分自身がgridviewで(webserviceからの)イメージを読み込もうとしていて、それがうまくいっていました。 Webサービスからすべてのイメージを読み込むために遅延アダプターを使用しました。スワイプ中にグリッドビュー画像の位置を変更することはできますか?

画像をクリックすると次のアクティビティに表示され、その画像をスワイプして次の画像が表示されます。何か案は???

答えて

0

これは、ViewPagerを使用すると比較的簡単に実現できます。ユーザがリストアイテムを選択すると、すべての画像(例えばURI)のリストと、ViewPagerを含むアクティビティに選択されたものを示すインデックスを渡す。その後、渡されたリストでViewPagerのアダプタを初期化し、現在の項目を設定してインデックスに表示することができます。

ViewPagerの使用方法に関するヒントや、developers.android.comのblog postについては、APIデモをご覧ください。 FragmentsをViewPagerにViewとして渡す代わりに、単にImageViewをインスタンス化してください。その方法については、this Q/A on SOが役に立つかもしれません。また、PagerAdapterのdocumentationは、読んでも同じように重要です。

//編集:上記の提案をコーディングするためのいくつかのポインタ:

持っているあなたのonItemClick選択指標としてだけでなく、余分ななどの画像を取得するための関連データを追加し、新しいインテントを作成し、活動を開始:

、すべてのエキストラを取得し、指定された位置/インデックスにViewPagerを初期化ViewPagerを含むあなたのImageViewerの活動に
@Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Intent intent = new Intent(this, ImageViewer.class); 
    intent.putExtra(PAGE_POSITION, position); 
    intent.putStringArrayListExtra(IMAGE_LIST, mImages) 
    // or add a serializable, e.g. an ArrayList<T> with your POJOs 
    intent.putExtra(IMAGE_LIST, mImages); 
    startActivity(intent); 
} 

if (getIntent() != null && getIntent().getExtras() != null { 
    mImagePosition = getIntent().getExtras().getInt(PAGE_POSITION, 0); 
    mImageList = getIntent().getExtras().getStringArrayList(IMAGE_LIST); 
    // or if you used Serializables 
    mImageList = (ArrayList<T>) getIntent().getExtras().getSerializable(IMAGE_LIST); 
    mViewPager.setAdapter(new ImagePagerAdapter()); 
    mViewPager.setCurrentItem(mImageIndex); 
} 

ImagePaderAdapterでは、表示する画像を含むImageViewsをインスタンス化します。そこ例のトンはそこにありますが、それは根拠にこのような何かを見てみましょう:私は上記のコードをテストしていませんが、またそれが完全であることを意味している

private class ImagePagerAdapter extends PagerAdapter { 

    public int getCount() { 
     return mImageList == null ? 0 : mImageList.size(); 
    } 

    public Object instantiateItem(View pager, int position) { 
     if (mInflater == null) mInflater = (LayoutInflater) container.getContext().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     View view = mInflater.inflate(R.layout.image_pager_item_layout, null, false); 
     ImageView photoImageView = (ImageView) view.findViewById(R.id.photo_imageview); 

     mImageLoader().loadImage(mImageList.get(position), photoImageView); 

     ((ViewPager) pager).addView(view, 0); 

     return view; 
    }  

    public void destroyItem(View pager, int position, Object object) { 
     ((ViewPager) pager).removeView((View) object); 
    } 

    public boolean isViewFromObject(View view, Object object) { 
     return view.equals(object); 
    } 

    public void finishUpdate(View container) { } 
    public void restoreState(Parcelable state, ClassLoader loader) { } 
    public void startUpdate(View container) { } 
    public Parcelable saveState() { return null; } 
} 

注意。たとえば、自分でLayoutInflaterへの参照を取得し、ImageViewに対して非同期にイメージを設定する「怠惰な」イメージローダを持つ方法を知っていると仮定します。 image_pager_item_layoutファイルは単にImageViewでもかまいませんが、ViewGroup内のビューのより複雑な階層(ListViewやGridViewなど)でもかまいません。画像にキャプションを簡単に追加することができます。それは全く同じです

+0

@ MH:申し訳ありません。私にとっては難しいです。 –

+0

先ほど提案したワークフローを説明するためにスニペットを追加しました。希望が助けてくれる! –

+0

ありがとうございました。私は、代わりにViewpagerを使用すると言いましたか? –