1

シンプルな Boggle アプリをコーディングしようとしています。すべてのキューブをシャッフルして新しいボードを表示する「シャッフル ボード」ボタンがあります。

問題は、LetterAdapter(内部LetterAdapter#shuffleで を呼び出して) を更新し、内部で,notifyDataSetChangedの任意の組み合わせを使用しても、ビューを更新できないことです。私が見つけた唯一の有効な方法は、アダプターをに再割り当てすることです。refreshDrawableState()invalidate()invalidateViews()onClickGridView

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 ほど読みましたが、私の場合は満足のいく回答が見つかりませんでした。

4

1 に答える 1

1

問題はあなたのgetView方法にあります。letterButton.setText(curLetter);条件外で電話する必要があります。

@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);            
    } else {
        letterButton = (Button) convertView;            
    }

    letterButton.setText(curLetter);        
    return letterButton;
}
于 2013-03-02T15:58:32.907 に答える