1
我想要编写一个简单的Boggle应用程序。有一个“洗牌板”按钮,应该洗牌所有的立方体,并显示新的板。GridView没有被更新
的问题是:即使我更新LetterAdapter
(内LetterAdapter#shuffle
,我叫notifyDataSetChanged
)和使用refreshDrawableState()
任意组合,invalidate()
,invalidateViews()
内onClick
我不能得到的视图进行更新。我能找到的唯一工作方式是将适配器重新分配到GridView
。
为什么没有refreshDrawableState()
,invalidate()
,invalidateViews()
或notifyDataSetChanged
工作?他们为什么没有视觉效果?
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final GridView letterGrid = (GridView) findViewById(R.id.letter_grid);
final LetterAdapter letterAdapter = new LetterAdapter(this);
letterGrid.setAdapter(letterAdapter);
Button shuffleButton = (Button) findViewById(R.id.shuffle_button);
shuffleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
letterAdapter.shuffle();
// --------------- RELEVANT PART
// letterGrid.refreshDrawableState();
// letterGrid.invalidate();
// letterGrid.invalidateViews();
letterGrid.setAdapter(letterAdapter);
// --------------- END
}
});
}
public class LetterAdapter extends BaseAdapter {
private Context mContext;
private BoggleBoard mBoggleBoard;
public LetterAdapter(Context context) {
mContext = context;
mBoggleBoard = new BoggleBoard();
}
public void shuffle() {
mBoggleBoard.shuffle();
notifyDataSetChanged();
}
@Override
public int getCount() {
return BoggleBoard.NUM_OF_CUBES;
}
@Override
public Object getItem(int position) {
return mBoggleBoard.getLetter(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Button letterButton;
final String curLetter = mBoggleBoard.getLetter(position);
if (convertView == null) {
letterButton = new Button(mContext);
letterButton.setText(curLetter);
} else {
letterButton = (Button) convertView;
}
return letterButton;
}
}
}
注:我已阅读了大约一打相关的问题/答案,但找不到任何满意的答案为我的情况。
Ooops ..不应该错过这个!谢谢! – kolistivra 2013-03-02 16:12:36