2013-03-02 112 views
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; 
     } 
    } 
} 

注:我已阅读了大约一打相关的问题/答案,但找不到任何满意的答案为我的情况。

回答

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; 
} 
+0

Ooops ..不应该错过这个!谢谢! – kolistivra 2013-03-02 16:12:36