GridView中的最后一个视图随机不更新

时间:2015-03-01 01:05:14

标签: android gridview

这是一个非常令人困惑的问题,因为它似乎是随机发生的。我有一个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的替代品?

1 个答案:

答案 0 :(得分:0)

确保从主线程或UI线程更新数据集notifyDatasetChanged(),否则无法保证重新绘制。

getView()方法中实例化对象并不是一个好主意,因为它被多次调用(imageView = new ImageView(mContext);)。请查看ViewHolder pattern,或使用RecyclerView