package com.justsystems.hpb.pad; import java.util.ArrayList; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.support.v4.view.PagerAdapter; import android.text.TextUtils.TruncateAt; import android.util.SparseArray; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import org.wordpress.android.WordPress; /** * カスタム投稿タイプを表示するViewPagerのアダプタ。<br> * 本来、ViewPagerは一画面に一アイテムしか表示させないが、今回は一画面に三アイテム表示する。<br> * このため、ViewPagerにはView幅の1/3のマージンをマイナスで設定する(左右にはみ出させるため)<br> * TextViewにはpaddingをView幅の1/3設定する。(文字列が隣のViewとかぶらないように) * */ public class PostTypePagerAdapter extends PagerAdapter { private Context context; private boolean isFirstItem = true; private final ArrayList<String> labels = new ArrayList<String>(); private final ArrayList<String> postTypes = new ArrayList<String>(); /** TextViewを保持するコンテナ。指定したインデックスのTextViewを取得するために利用する。 */ private final SparseArray<TextView> views = new SparseArray<TextView>(); private int padding; private final int textSizeLarge; private final int textSizeSmall; public PostTypePagerAdapter(Context context, int currentBlogId) { this.context = context; onBlogChanged(currentBlogId); Resources r = context.getResources(); this.textSizeLarge = r .getDimensionPixelSize(R.dimen.startpage_type_text_large); this.textSizeSmall = r .getDimensionPixelSize(R.dimen.startpage_type_text_small); } public void onBlogChanged(int currentBlogId) { this.labels.clear(); this.postTypes.clear(); Resources res = this.context.getResources(); this.labels.add(res.getString(R.string.post)); this.postTypes.add("post"); WordPress.wpDB.getPostTypes(currentBlogId, labels, postTypes); this.labels.add(res.getString(R.string.page)); this.postTypes.add("page"); notifyDataSetChanged(); } /** * 指定されたインデックスの投稿タイプ文字列を取得します。 * * @param index * @return */ public String getSelectedPostType(int index) { return this.postTypes.get(index); } /** * TextViewの文字色を選択、非選択状態によって更新します。 * * @param position * 文字色を変えるTexiView * @param isSelected * 選択状態。 */ public void setSelected(int position, boolean isSelected) { TextView view = this.views.get(position); if (view == null) { return; } if (isSelected) { view.setTextColor(Color.WHITE); view.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeLarge); } else { view.setTextColor(0xFF949393); view.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSizeSmall); } } /** * テキストViewのpaddingを更新します * * @param padding */ public void setTextViewPadding(int padding) { this.padding = padding; for (int i = 0; i < this.labels.size(); i++) { TextView view = this.views.get(i); if (view == null) { continue; } view.setPadding(this.padding, 0, this.padding, 0); } } @Override public int getCount() { return labels.size(); } @Override public CharSequence getPageTitle(int position) { return this.labels.get(position); } @Override public Object instantiateItem(ViewGroup container, int position) { String title = this.labels.get(position); // View を生成 TextView textView = new TextView(context.getApplicationContext()); if (position != this.labels.size() - 1) { Drawable d = this.context.getResources().getDrawable( R.drawable.startpage_type_back); textView.setBackgroundDrawable(d); } textView.setMaxLines(1); textView.setEllipsize(TruncateAt.END); textView.setGravity(Gravity.CENTER); textView.setPadding(this.padding, 0, this.padding, 0); textView.setText(title); // コンテナに追加 container.addView(textView); views.put(position, textView); if (isFirstItem) { setSelected(position, true); isFirstItem = false; } return textView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); views.remove(position); } @Override public void notifyDataSetChanged() { super.notifyDataSetChanged(); for (int i = 0; i < views.size(); i++) { int key = views.keyAt(i); setText(key); } } private void setText(int position) { if (labels.size() == 0 || position >= labels.size()) { return; } String title = this.labels.get(position); TextView textView = this.views.get(position); textView.setText(title); if (position == this.labels.size() - 1 && textView.getBackground() != null) { textView.setBackgroundDrawable(null); } else if (position != this.labels.size() - 1 && textView.getBackground() == null) { Drawable d = this.context.getResources().getDrawable( R.drawable.startpage_type_back); textView.setBackgroundDrawable(d); } textView.setPadding(this.padding, 0, this.padding, 0); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } }