这是一个非常令人困惑的问题,因为它似乎是随机发生的。我有一个GridView,我在其中设置onCreate()中的列的大小和列数,然后我使用在imageViews中的数组中随机选择的drawable填充网格,直到gridView已满。当用户单击其中一个imageView时,会在视图上设置背景以突出显示该背景,当他们单击另一个视图时,将删除此突出显示。这通常可以正常工作,但随着游戏的进行,网格会重新绘制并添加更多视图,问题通常从网格的第三次重绘开始。当用户点击gridView中的最后一个视图时,它按照预期的方式工作,但是在第二次单击之前视图不会更新,在第二次单击之后,视图将落后于应该的位置。我还注意到,如果你在gridView内部而不是在任何视图上单击,这也会使最后一个视图刷新并进入它应该处于的状态。
我相信问题出现在imageAdapter中,所以代码是:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return gridSize;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
//loop is an int to show how many views have been drawn
public View getView(int position, View convertView, ViewGroup parent) {
if (loop == 0){ //remove all views before drawing new grid
grid.removeAllViewsInLayout();
}
if (loop < gridSize+4){stops the code from rerunning once grid drawn
if (clover == 1){//if power up active
randomPosition = rng.nextInt(27);
}
else if (clover == 0){
randomPosition = rng.nextInt(12);
}
imageView = new ImageView(mContext);
imageView.setScaleType(ScaleType.CENTER_CROP);
imageView.setLayoutParams(new GridView.LayoutParams(circleS, circleS));
imageView.setPadding(5, 5, 5, 5);
imgSet();
}
else {
//do nothing
}
return imageView;
}
}//end adapter////////
我使用:if(loop&lt; gridSize + 4)来检测网格是否还没有被绘制,这是一种解决方法,因为有时单击视图时imageAdapter会重新运行,+ 4是因为imageAdapter在添加任何视图之前运行4次,我不知道为什么。
有没有人知道这个愚蠢的GridView和ImageAdapter的替代品?
答案 0 :(得分:0)
确保从主线程或UI线程更新数据集notifyDatasetChanged()
,否则无法保证重新绘制。
在getView()
方法中实例化对象并不是一个好主意,因为它被多次调用(imageView = new ImageView(mContext);
)。请查看ViewHolder pattern,或使用RecyclerView。