am a0c3e02d: Refactor SuggestionStripLayoutHelper a bit

* commit 'a0c3e02d7168dd4cee4cad51491537dadb0362cc':
  Refactor SuggestionStripLayoutHelper a bit
This commit is contained in:
Tadashi G. Takaoka 2013-05-31 02:36:56 -07:00 committed by Android Git Automerger
commit 8a7acf147d
5 changed files with 134 additions and 127 deletions

View file

@ -161,7 +161,7 @@
<declare-styleable name="SuggestionStripView">
<attr name="suggestionStripOption" format="integer">
<!-- This should be aligned with SuggestionStripViewParams.AUTO_CORRECT_* and etc. -->
<!-- This should be aligned with SuggestionStripLayoutHelper.AUTO_CORRECT_* and etc. -->
<flag name="autoCorrectBold" value="0x01" />
<flag name="autoCorrectUnderline" value="0x02" />
<flag name="validTypedWordBold" value="0x04" />

View file

@ -24,6 +24,9 @@ import java.util.Arrays;
import java.util.HashSet;
public final class SuggestedWords {
public static final int INDEX_OF_TYPED_WORD = 0;
public static final int INDEX_OF_AUTO_CORRECTION = 1;
private static final ArrayList<SuggestedWordInfo> EMPTY_WORD_INFO_LIST =
CollectionUtils.newArrayList(0);
public static final SuggestedWords EMPTY = new SuggestedWords(
@ -61,12 +64,12 @@ public final class SuggestedWords {
return mSuggestedWordInfoList.size();
}
public String getWord(int pos) {
return mSuggestedWordInfoList.get(pos).mWord;
public String getWord(final int index) {
return mSuggestedWordInfoList.get(index).mWord;
}
public SuggestedWordInfo getInfo(int pos) {
return mSuggestedWordInfoList.get(pos);
public SuggestedWordInfo getInfo(final int index) {
return mSuggestedWordInfoList.get(index);
}
public boolean willAutoCorrect() {
@ -108,8 +111,8 @@ public final class SuggestedWords {
SuggestedWordInfo.KIND_TYPED, Dictionary.TYPE_USER_TYPED));
alreadySeen.add(typedWord.toString());
final int previousSize = previousSuggestions.size();
for (int pos = 1; pos < previousSize; pos++) {
final SuggestedWordInfo prevWordInfo = previousSuggestions.getInfo(pos);
for (int index = 1; index < previousSize; index++) {
final SuggestedWordInfo prevWordInfo = previousSuggestions.getInfo(index);
final String prevWord = prevWordInfo.mWord;
// Filter out duplicate suggestion.
if (!alreadySeen.contains(prevWord)) {

View file

@ -61,7 +61,7 @@ public final class MoreSuggestions extends Keyboard {
super();
}
public int layout(final SuggestedWords suggestedWords, final int fromPos,
public int layout(final SuggestedWords suggestedWords, final int fromIndex,
final int maxWidth, final int minWidth, final int maxRow, final Paint paint,
final Resources res) {
clearKeys();
@ -70,53 +70,54 @@ public final class MoreSuggestions extends Keyboard {
final float padding = res.getDimension(R.dimen.more_suggestions_key_horizontal_padding);
int row = 0;
int pos = fromPos, rowStartPos = fromPos;
int index = fromIndex;
int rowStartIndex = fromIndex;
final int size = Math.min(suggestedWords.size(), SuggestionStripView.MAX_SUGGESTIONS);
while (pos < size) {
final String word = suggestedWords.getWord(pos);
while (index < size) {
final String word = suggestedWords.getWord(index);
// TODO: Should take care of text x-scaling.
mWidths[pos] = (int)(TypefaceUtils.getLabelWidth(word, paint) + padding);
final int numColumn = pos - rowStartPos + 1;
mWidths[index] = (int)(TypefaceUtils.getLabelWidth(word, paint) + padding);
final int numColumn = index - rowStartIndex + 1;
final int columnWidth =
(maxWidth - mDividerWidth * (numColumn - 1)) / numColumn;
if (numColumn > MAX_COLUMNS_IN_ROW
|| !fitInWidth(rowStartPos, pos + 1, columnWidth)) {
|| !fitInWidth(rowStartIndex, index + 1, columnWidth)) {
if ((row + 1) >= maxRow) {
break;
}
mNumColumnsInRow[row] = pos - rowStartPos;
rowStartPos = pos;
mNumColumnsInRow[row] = index - rowStartIndex;
rowStartIndex = index;
row++;
}
mColumnOrders[pos] = pos - rowStartPos;
mRowNumbers[pos] = row;
pos++;
mColumnOrders[index] = index - rowStartIndex;
mRowNumbers[index] = row;
index++;
}
mNumColumnsInRow[row] = pos - rowStartPos;
mNumColumnsInRow[row] = index - rowStartIndex;
mNumRows = row + 1;
mBaseWidth = mOccupiedWidth = Math.max(
minWidth, calcurateMaxRowWidth(fromPos, pos));
minWidth, calcurateMaxRowWidth(fromIndex, index));
mBaseHeight = mOccupiedHeight = mNumRows * mDefaultRowHeight + mVerticalGap;
return pos - fromPos;
return index - fromIndex;
}
private boolean fitInWidth(final int startPos, final int endPos, final int width) {
for (int pos = startPos; pos < endPos; pos++) {
if (mWidths[pos] > width)
private boolean fitInWidth(final int startIndex, final int endIndex, final int width) {
for (int index = startIndex; index < endIndex; index++) {
if (mWidths[index] > width)
return false;
}
return true;
}
private int calcurateMaxRowWidth(final int startPos, final int endPos) {
private int calcurateMaxRowWidth(final int startIndex, final int endIndex) {
int maxRowWidth = 0;
int pos = startPos;
int index = startIndex;
for (int row = 0; row < mNumRows; row++) {
final int numColumnInRow = mNumColumnsInRow[row];
int maxKeyWidth = 0;
while (pos < endPos && mRowNumbers[pos] == row) {
maxKeyWidth = Math.max(maxKeyWidth, mWidths[pos]);
pos++;
while (index < endIndex && mRowNumbers[index] == row) {
maxKeyWidth = Math.max(maxKeyWidth, mWidths[index]);
index++;
}
maxRowWidth = Math.max(maxRowWidth,
maxKeyWidth * numColumnInRow + mDividerWidth * (numColumnInRow - 1));
@ -130,40 +131,40 @@ public final class MoreSuggestions extends Keyboard {
{ 2, 0, 1},
};
public int getNumColumnInRow(final int pos) {
return mNumColumnsInRow[mRowNumbers[pos]];
public int getNumColumnInRow(final int index) {
return mNumColumnsInRow[mRowNumbers[index]];
}
public int getColumnNumber(final int pos) {
final int columnOrder = mColumnOrders[pos];
final int numColumn = getNumColumnInRow(pos);
public int getColumnNumber(final int index) {
final int columnOrder = mColumnOrders[index];
final int numColumn = getNumColumnInRow(index);
return COLUMN_ORDER_TO_NUMBER[numColumn - 1][columnOrder];
}
public int getX(final int pos) {
final int columnNumber = getColumnNumber(pos);
return columnNumber * (getWidth(pos) + mDividerWidth);
public int getX(final int index) {
final int columnNumber = getColumnNumber(index);
return columnNumber * (getWidth(index) + mDividerWidth);
}
public int getY(final int pos) {
final int row = mRowNumbers[pos];
public int getY(final int index) {
final int row = mRowNumbers[index];
return (mNumRows -1 - row) * mDefaultRowHeight + mTopPadding;
}
public int getWidth(final int pos) {
final int numColumnInRow = getNumColumnInRow(pos);
public int getWidth(final int index) {
final int numColumnInRow = getNumColumnInRow(index);
return (mOccupiedWidth - mDividerWidth * (numColumnInRow - 1)) / numColumnInRow;
}
public void markAsEdgeKey(final Key key, final int pos) {
final int row = mRowNumbers[pos];
public void markAsEdgeKey(final Key key, final int index) {
final int row = mRowNumbers[index];
if (row == 0)
key.markAsBottomEdge(this);
if (row == mNumRows - 1)
key.markAsTopEdge(this);
final int numColumnInRow = mNumColumnsInRow[row];
final int column = getColumnNumber(pos);
final int column = getColumnNumber(index);
if (column == 0)
key.markAsLeftEdge(this);
if (column == numColumnInRow - 1)
@ -174,15 +175,15 @@ public final class MoreSuggestions extends Keyboard {
public static final class Builder extends KeyboardBuilder<MoreSuggestionsParam> {
private final MoreSuggestionsView mPaneView;
private SuggestedWords mSuggestedWords;
private int mFromPos;
private int mToPos;
private int mFromIndex;
private int mToIndex;
public Builder(final Context context, final MoreSuggestionsView paneView) {
super(context, new MoreSuggestionsParam());
mPaneView = paneView;
}
public Builder layout(final SuggestedWords suggestedWords, final int fromPos,
public Builder layout(final SuggestedWords suggestedWords, final int fromIndex,
final int maxWidth, final int minWidth, final int maxRow,
final Keyboard parentKeyboard) {
final int xmlId = R.xml.kbd_suggestions_pane_template;
@ -190,10 +191,10 @@ public final class MoreSuggestions extends Keyboard {
mParams.mVerticalGap = mParams.mTopPadding = parentKeyboard.mVerticalGap / 2;
mPaneView.updateKeyboardGeometry(mParams.mDefaultRowHeight);
final int count = mParams.layout(suggestedWords, fromPos, maxWidth, minWidth, maxRow,
final int count = mParams.layout(suggestedWords, fromIndex, maxWidth, minWidth, maxRow,
mPaneView.newLabelPaint(null /* key */), mResources);
mFromPos = fromPos;
mToPos = fromPos + count;
mFromIndex = fromIndex;
mToIndex = fromIndex + count;
mSuggestedWords = suggestedWords;
return this;
}
@ -201,20 +202,20 @@ public final class MoreSuggestions extends Keyboard {
@Override
public MoreSuggestions build() {
final MoreSuggestionsParam params = mParams;
for (int pos = mFromPos; pos < mToPos; pos++) {
final int x = params.getX(pos);
final int y = params.getY(pos);
final int width = params.getWidth(pos);
final String word = mSuggestedWords.getWord(pos);
final String info = Utils.getDebugInfo(mSuggestedWords, pos);
final int index = pos + SUGGESTION_CODE_BASE;
for (int index = mFromIndex; index < mToIndex; index++) {
final int x = params.getX(index);
final int y = params.getY(index);
final int width = params.getWidth(index);
final String word = mSuggestedWords.getWord(index);
final String info = Utils.getDebugInfo(mSuggestedWords, index);
final int indexInMoreSuggestions = index + SUGGESTION_CODE_BASE;
final Key key = new Key(
params, word, info, KeyboardIconsSet.ICON_UNDEFINED, index, null, x, y,
width, params.mDefaultRowHeight, 0);
params.markAsEdgeKey(key, pos);
params, word, info, KeyboardIconsSet.ICON_UNDEFINED, indexInMoreSuggestions,
null, x, y, width, params.mDefaultRowHeight, 0);
params.markAsEdgeKey(key, index);
params.onAddKey(key);
final int columnNumber = params.getColumnNumber(pos);
final int numColumnInRow = params.getNumColumnInRow(pos);
final int columnNumber = params.getColumnNumber(index);
final int numColumnInRow = params.getNumColumnInRow(index);
if (columnNumber < numColumnInRow - 1) {
final Divider divider = new Divider(params, params.mDivider, x + width, y,
params.mDividerWidth, params.mDefaultRowHeight);

View file

@ -23,9 +23,9 @@ import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.Paint.Align;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
@ -40,14 +40,13 @@ import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.inputmethod.keyboard.ViewLayoutUtils;
import com.android.inputmethod.latin.AutoCorrection;
import com.android.inputmethod.latin.CollectionUtils;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.ResourceUtils;
@ -71,7 +70,11 @@ final class SuggestionStripLayoutHelper {
private int mMaxMoreSuggestionsRow;
public final float mMinMoreSuggestionsWidth;
public final int mMoreSuggestionsBottomGap;
public boolean mMoreSuggestionsAvailable;
// The index of these {@link ArrayList} is the position in the suggestion strip. The indices
// increase towards the right for LTR scripts and the left for RTL scripts, starting with 0.
// The position of the most important suggestion is in {@link #mCenterPositionInStrip}
private final ArrayList<TextView> mWordViews;
private final ArrayList<View> mDividerViews;
private final ArrayList<TextView> mDebugInfoViews;
@ -89,16 +92,14 @@ final class SuggestionStripLayoutHelper {
private static final CharacterStyle BOLD_SPAN = new StyleSpan(Typeface.BOLD);
private static final CharacterStyle UNDERLINE_SPAN = new UnderlineSpan();
private final int mSuggestionStripOption;
// These constants are the flag values of
// {@link R.styleable#SuggestionStripView_suggestionStripOption} attribute.
private static final int AUTO_CORRECT_BOLD = 0x01;
private static final int AUTO_CORRECT_UNDERLINE = 0x02;
private static final int VALID_TYPED_WORD_BOLD = 0x04;
private final int mSuggestionStripOption;
private final ArrayList<CharSequence> mWords = CollectionUtils.newArrayList();
public boolean mMoreSuggestionsAvailable;
private final TextView mWordToSaveView;
private final TextView mLeftwardsArrowView;
private final TextView mHintToSaveView;
@ -205,7 +206,7 @@ final class SuggestionStripLayoutHelper {
return new BitmapDrawable(res, buffer);
}
private CharSequence getStyledSuggestionWord(final SuggestedWords suggestedWords,
private CharSequence getStyledSuggestedWord(final SuggestedWords suggestedWords,
final int indexInSuggestedWords) {
final String word = suggestedWords.getWord(indexInSuggestedWords);
final boolean isAutoCorrect = indexInSuggestedWords == 1
@ -233,7 +234,8 @@ final class SuggestionStripLayoutHelper {
final SuggestedWords suggestedWords) {
// TODO: This works for 3 suggestions. Revisit this algorithm when there are 5 or more
// suggestions.
final int mostImportantIndexInSuggestedWords = suggestedWords.willAutoCorrect() ? 1 : 0;
final int mostImportantIndexInSuggestedWords = suggestedWords.willAutoCorrect()
? SuggestedWords.INDEX_OF_AUTO_CORRECTION : SuggestedWords.INDEX_OF_TYPED_WORD;
if (positionInStrip == mCenterPositionInStrip) {
return mostImportantIndexInSuggestedWords;
}
@ -245,10 +247,9 @@ final class SuggestionStripLayoutHelper {
private int getSuggestionTextColor(final int positionInStrip,
final SuggestedWords suggestedWords) {
final int indexInSuggestedWords = getIndexInSuggestedWords(
positionInStrip, suggestedWords);
final int indexInSuggestedWords = getIndexInSuggestedWords(positionInStrip, suggestedWords);
// TODO: Need to revisit this logic with bigram suggestions
final boolean isSuggested = (indexInSuggestedWords != 0);
final boolean isSuggested = (indexInSuggestedWords != SuggestedWords.INDEX_OF_TYPED_WORD);
final int color;
if (positionInStrip == mCenterPositionInStrip && suggestedWords.willAutoCorrect()) {
@ -265,7 +266,8 @@ final class SuggestionStripLayoutHelper {
// is in slot 1.
if (positionInStrip == mCenterPositionInStrip
&& AutoCorrection.shouldBlockAutoCorrectionBySafetyNet(
suggestedWords.getWord(1), suggestedWords.getWord(0))) {
suggestedWords.getWord(SuggestedWords.INDEX_OF_AUTO_CORRECTION),
suggestedWords.getWord(SuggestedWords.INDEX_OF_TYPED_WORD))) {
return 0xFFFF0000;
}
}
@ -296,7 +298,7 @@ final class SuggestionStripLayoutHelper {
}
final int countInStrip = mSuggestionsCountInStrip;
setupWords(suggestedWords, countInStrip);
setupWordViewsTextAndColor(suggestedWords, countInStrip);
mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
int x = 0;
for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
@ -308,41 +310,37 @@ final class SuggestionStripLayoutHelper {
}
final int width = getSuggestionWidth(positionInStrip, placerView.getWidth());
final TextView wordView = layoutWord(suggestedWords, positionInStrip, width);
final TextView wordView = layoutWord(positionInStrip, width);
stripView.addView(wordView);
setLayoutWeight(wordView, getSuggestionWeight(positionInStrip),
ViewGroup.LayoutParams.MATCH_PARENT);
x += wordView.getMeasuredWidth();
if (SuggestionStripView.DBG) {
layoutDebugInfo(suggestedWords, positionInStrip, placerView, x);
layoutDebugInfo(positionInStrip, placerView, x);
}
}
}
/**
* Format appropriately the suggested word indirectly specified by
* <code>positionInStrip</code> as text in a corresponding {@link TextView}. When the
* suggested word doesn't exist, the corresponding {@link TextView} will be disabled
* and never respond to user interaction. The suggested word may be shrunk or ellipsized to
* fit in the specified width.
* Format appropriately the suggested word in {@link #mWordViews} specified by
* <code>positionInStrip</code>. When the suggested word doesn't exist, the corresponding
* {@link TextView} will be disabled and never respond to user interaction. The suggested word
* may be shrunk or ellipsized to fit in the specified width.
*
* The <code>positionInStrip</code> argument is the index in the suggestion strip. The indices
* increase towards the right for LTR scripts and the left for RTL scripts, starting with 0.
* The index of the most important suggestion is in {@link #mCenterPositionInStrip}. This
* The position of the most important suggestion is in {@link #mCenterPositionInStrip}. This
* usually doesn't match the index in <code>suggedtedWords</code> -- see
* {@link #getIndexInSuggestedWords(int,SuggestedWords)}.
*
* @param suggestedWords the list of suggestions.
* @param positionInStrip the in the suggestion strip.
* @param positionInStrip the position in the suggestion strip.
* @param width the maximum width for layout in pixels.
* @return the {@link TextView} containing the suggested word appropriately formatted.
*/
private TextView layoutWord(final SuggestedWords suggestedWords, final int positionInStrip,
final int width) {
final int indexInSuggestedWords = getIndexInSuggestedWords(positionInStrip, suggestedWords);
final CharSequence word = mWords.get(indexInSuggestedWords);
final TextView wordView = mWordViews.get(indexInSuggestedWords);
private TextView layoutWord(final int positionInStrip, final int width) {
final TextView wordView = mWordViews.get(positionInStrip);
final CharSequence word = wordView.getText();
if (positionInStrip == mCenterPositionInStrip && mMoreSuggestionsAvailable) {
// TODO: This "more suggestions hint" should have a nicely designed icon.
wordView.setCompoundDrawablesWithIntrinsicBounds(
@ -355,7 +353,6 @@ final class SuggestionStripLayoutHelper {
// Disable this suggestion if the suggestion is null or empty.
wordView.setEnabled(!TextUtils.isEmpty(word));
wordView.setTextColor(getSuggestionTextColor(positionInStrip, suggestedWords));
final CharSequence text = getEllipsizedText(word, width, wordView.getPaint());
final float scaleX = wordView.getTextScaleX();
wordView.setText(text); // TextView.setText() resets text scale x to 1.0.
@ -363,18 +360,13 @@ final class SuggestionStripLayoutHelper {
return wordView;
}
private void layoutDebugInfo(final SuggestedWords suggestedWords, final int positionInStrip,
final ViewGroup placerView, final int x) {
final int indexInSuggestedWords = getIndexInSuggestedWords(positionInStrip, suggestedWords);
if (indexInSuggestedWords >= suggestedWords.size()) {
return;
}
final String debugInfo = Utils.getDebugInfo(suggestedWords, indexInSuggestedWords);
private void layoutDebugInfo(final int positionInStrip, final ViewGroup placerView,
final int x) {
final TextView debugInfoView = mDebugInfoViews.get(positionInStrip);
final CharSequence debugInfo = debugInfoView.getText();
if (debugInfo == null) {
return;
}
final TextView debugInfoView = mDebugInfoViews.get(indexInSuggestedWords);
debugInfoView.setText(debugInfo);
placerView.addView(debugInfoView);
debugInfoView.measure(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@ -399,39 +391,52 @@ final class SuggestionStripLayoutHelper {
return (1.0f - mCenterSuggestionWeight) / (mSuggestionsCountInStrip - 1);
}
private void setupWords(final SuggestedWords suggestedWords, final int countInStrip) {
mWords.clear();
private void setupWordViewsTextAndColor(final SuggestedWords suggestedWords,
final int countInStrip) {
final int count = Math.min(suggestedWords.size(), countInStrip);
for (int pos = 0; pos < count; pos++) {
final CharSequence styled = getStyledSuggestionWord(suggestedWords, pos);
mWords.add(styled);
for (int positionInStrip = 0; positionInStrip < count; positionInStrip++) {
final int indexInSuggestedWords =
getIndexInSuggestedWords(positionInStrip, suggestedWords);
final TextView wordView = mWordViews.get(positionInStrip);
// {@link TextView#getTag()} is used to get the index in suggestedWords at
// {@link SuggestionStripView#onClick(View)}.
wordView.setTag(indexInSuggestedWords);
wordView.setText(getStyledSuggestedWord(suggestedWords, indexInSuggestedWords));
wordView.setTextColor(getSuggestionTextColor(positionInStrip, suggestedWords));
if (SuggestionStripView.DBG) {
mDebugInfoViews.get(positionInStrip).setText(
Utils.getDebugInfo(suggestedWords, indexInSuggestedWords));
}
}
for (int pos = count; pos < countInStrip; pos++) {
// Make this inactive for touches in layout().
mWords.add(null);
for (int positionInStrip = count; positionInStrip < countInStrip; positionInStrip++) {
mWordViews.get(positionInStrip).setText(null);
// Make this inactive for touches in {@link #layoutWord(int,int)}.
if (SuggestionStripView.DBG) {
mDebugInfoViews.get(positionInStrip).setText(null);
}
}
}
private void layoutPunctuationSuggestions(final SuggestedWords suggestedWords,
final ViewGroup stripView) {
final int countInStrip = Math.min(suggestedWords.size(), PUNCTUATIONS_IN_STRIP);
for (int indexInStrip = 0; indexInStrip < countInStrip; indexInStrip++) {
if (indexInStrip != 0) {
for (int positionInStrip = 0; positionInStrip < countInStrip; positionInStrip++) {
if (positionInStrip != 0) {
// Add divider if this isn't the left most suggestion in suggestions strip.
addDivider(stripView, mDividerViews.get(indexInStrip));
addDivider(stripView, mDividerViews.get(positionInStrip));
}
final TextView word = mWordViews.get(indexInStrip);
word.setEnabled(true);
word.setTextColor(mColorAutoCorrect);
final String text = suggestedWords.getWord(indexInStrip);
word.setText(text);
word.setTextScaleX(1.0f);
word.setCompoundDrawables(null, null, null, null);
stripView.addView(word);
setLayoutWeight(word, 1.0f, mSuggestionsStripHeight);
final TextView wordView = mWordViews.get(positionInStrip);
wordView.setEnabled(true);
wordView.setTextColor(mColorAutoCorrect);
final String punctuation = suggestedWords.getWord(positionInStrip);
wordView.setText(punctuation);
wordView.setTextScaleX(1.0f);
wordView.setCompoundDrawables(null, null, null, null);
stripView.addView(wordView);
setLayoutWeight(wordView, 1.0f, mSuggestionsStripHeight);
}
mMoreSuggestionsAvailable = false;
mMoreSuggestionsAvailable = (suggestedWords.size() > countInStrip);
}
public void layoutAddToDictionaryHint(final String word, final ViewGroup stripView,

View file

@ -93,12 +93,10 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
mSuggestionsStrip = (ViewGroup)findViewById(R.id.suggestions_strip);
for (int pos = 0; pos < MAX_SUGGESTIONS; pos++) {
final TextView word = (TextView)inflater.inflate(R.layout.suggestion_word, null);
word.setTag(pos);
word.setOnClickListener(this);
word.setOnLongClickListener(this);
mWordViews.add(word);
final View divider = inflater.inflate(R.layout.suggestion_divider, null);
divider.setTag(pos);
divider.setOnClickListener(this);
mDividerViews.add(divider);
mDebugInfoViews.add((TextView)inflater.inflate(R.layout.suggestion_info, null));