adapter の中でレイアウトを云々
ViewPagerAdapter#instantiateItem メソドの中でレイアウトを云々して引数でもらってくる View に addView するのですが、例えばその中で用意する表示する View をクリックしたらダイアログを表示して PositiveButton がクリックされたらデータ削除、みたいな処理を仕込む時にはリスナを実装した独自クラスを作って必要なものは属性にしてしまえば良いらしい事が分かったので実装してみました。
例えば ImageView なソレがあるとして instantiateItem の中で以下。あ、コンストラクタは以下なカンジ。
public HogePagerAdapter(Context context) { mContext = context; mResolver = mContext.getContentResolver(); mList = new ArrayList<Long>(); }
前提としては、属性に Context および ContentResolver なオブジェクトの参照と _id を保持するリストを持っておきます。
で、instantiateItem でレイアウトを持ってきて
LayoutInflater inflater = LayoutInflater.from(mContext); View v = inflater.inflate(R.layout.hoge, null);
そこに記載されている ImageView を取得。
ImageView iv = (ImageView)v.findViewById(r.id.image); iv.setImageBitmap(bitmap);
bitmap はこの上でよしなに変換されていることとします。
で、独自リスナを new して云々。
MyOnClickListener l = new MyOnClickListener(id); iv.setOnClickListener(l);
ええと、id もこの上でよしなに取得されていることとさせて下さい。
で、この MyOnClickListener が以下な定義。
private class MyOnClickListener implements OnLongClickListener { private AlertDialog.Builder mBuilder; private Long id;
画像がクリックされたら AlertDialog が出る的ナニ。
これ系ってコンストラクタの方が長いですね。
public MyOnClickListener(Long id) { this.id = id; mBuilder = new AlertDialog.Builder(mContext); mBuilder.setTitle("確認"); String msg = "これを云々してもよろしいですか?"; mBuilder.setMessage(msg); mBuilder.setPositiveButton("はい", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // はい、の時の処理を記述 dialog.dismiss(); } });
ちなみに dialog を消すだけではなくて Activity さえも閉じたい場合は以下な記述でイケました。
((Activity)HogePagerAdapter.this.mContext).finish();
あとは、OnClick な callback な記述が以下。
@override public void onClick(View v) { AlertDialog alertDialog = mBuilder.create(); alertDialog.show(); }
もう一つ
今、CursorLoader と PagerAdapter を使って、あるいは上のような仕掛けを使って情報更新してその結果を ViewPager に反映させたい的な実装ができるかどうかを確認中なんですが、情報お持ちの方はフォロー頂ければ幸いです。
ちなみにその調査結果みたいなソレも解決すれば公開の方向で。