シンプルな Boggle アプリをコーディングしようとしています。すべてのキューブをシャッフルして新しいボードを表示する「シャッフル ボード」ボタンがあります。
問題は、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;
}
}
}
注: 関連する質問/回答を約 10 ほど読みましたが、私の場合は満足のいく回答が見つかりませんでした。