滚动后 Gridview 搞砸了
Gridview messed up after scrolling
我正在为我的填字游戏使用 GridView。在滚动 gridview 之后,所有的黑色部分(非字母框)都显示了不应该发生的字母。
这是我的适配器。谁能帮忙?谢谢
private class CrossWordPuzzleAdapter extends BaseAdapter {
private Context mContext;
private int mWidth, mHeight;
public CrossWordPuzzleAdapter(Context c, int width, int height) {
mContext = c;
mWidth = width;
mHeight = height;
}
public int getCount() {
return mWidth * mHeight;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater) mContext
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.box_layout, null);
holder = new ViewHolder();
holder.numberText = (TextView) convertView.findViewById(R.id.numberText);
holder.charText = (GridViewItem) convertView.findViewById(R.id.charText);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
int x = -1, y = -1;
if (position < mWidth) {
x = position;
y = 0;
} else {
x = position % mWidth;
y = position / mHeight;
}
if (mPuzzleBoard.getCharPlace(x, y) != '[==]' && mPuzzleBoard.getCharPlace(x, y) != ' ') {
String questionNoStr = mPuzzleBoard.getQuestionNo(x, y);
holder.numberText.setText(questionNoStr);
if (isRevealed) {
holder.charText.setText("" + Character.toString(mPuzzleBoard.getCharPlace(x, y)).toUpperCase());
holder.charText.setTextColor(Color.GREEN);
}
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_white));
} else {
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_black));
convertView.setSelected(false);
}
return convertView;
}
我终于找到了解决办法。显示字母的错误框实际上是包含先前字母的视图的先前框。所以,滚动后位置都乱了,虽然我把框颜色设置为黑色,但我没有设置框为空。
所以这就是我所做的:
else {
holder.numberText.setText(""); //<< reset the box to empty
holder.charText.setText(""); //<< reset the box to empty
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_black));
convertView.setSelected(false);
}
我正在为我的填字游戏使用 GridView。在滚动 gridview 之后,所有的黑色部分(非字母框)都显示了不应该发生的字母。
这是我的适配器。谁能帮忙?谢谢
private class CrossWordPuzzleAdapter extends BaseAdapter {
private Context mContext;
private int mWidth, mHeight;
public CrossWordPuzzleAdapter(Context c, int width, int height) {
mContext = c;
mWidth = width;
mHeight = height;
}
public int getCount() {
return mWidth * mHeight;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater) mContext
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.box_layout, null);
holder = new ViewHolder();
holder.numberText = (TextView) convertView.findViewById(R.id.numberText);
holder.charText = (GridViewItem) convertView.findViewById(R.id.charText);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
int x = -1, y = -1;
if (position < mWidth) {
x = position;
y = 0;
} else {
x = position % mWidth;
y = position / mHeight;
}
if (mPuzzleBoard.getCharPlace(x, y) != '[==]' && mPuzzleBoard.getCharPlace(x, y) != ' ') {
String questionNoStr = mPuzzleBoard.getQuestionNo(x, y);
holder.numberText.setText(questionNoStr);
if (isRevealed) {
holder.charText.setText("" + Character.toString(mPuzzleBoard.getCharPlace(x, y)).toUpperCase());
holder.charText.setTextColor(Color.GREEN);
}
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_white));
} else {
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_black));
convertView.setSelected(false);
}
return convertView;
}
我终于找到了解决办法。显示字母的错误框实际上是包含先前字母的视图的先前框。所以,滚动后位置都乱了,虽然我把框颜色设置为黑色,但我没有设置框为空。
所以这就是我所做的:
else {
holder.numberText.setText(""); //<< reset the box to empty
holder.charText.setText(""); //<< reset the box to empty
holder.charText.setBackground(getResources().getDrawable(R.drawable.letter_box_black));
convertView.setSelected(false);
}