如何从 activity 更改 GridView(按钮适配器)中不可见按钮的背景

How to change background of non-visible buttons in GridView (Button adapter) from an activity

我的代码仅适用于可见视图。

 mGridView = (GridView) findViewById(R.id.gridView);
 mGridView.setAdapter(new ButtonAdapter(this, list));

计时器滴答时调用的方法:

public void setBackground(int i) {
    Button button = (Button) mGridView.getChildAt(i); 
    button.setBackgroundResource(R.drawable.button_shape);

此方法会导致 NPE,因为 getChildAt 无法访问不可见的子对象。 我尝试了一些在这里找到的解决方案,但到目前为止没有运气(android - listview get item view by position - 这个解决方案没有导致 NPE,但一次为更多按钮更改背景)

我需要的是在第一次打勾时更改第一个按钮的背景,在第二次打勾时更改第二个按钮的背景。最后一个按钮在最后一次打勾时更改,并在滚动时保持一致。

我在 ButtonAdapter 中的 getView 方法:

public View getView(final int position,
                    View convertView, ViewGroup parent) {
    Button btn;
    LayoutInflater inflater = LayoutInflater.from(mContext);
    if (convertView == null) {
        // if it's not recycled, initialize some attributes          
        btn = (Button) inflater.inflate(R.layout.button, parent, false);
        int width = mContext.getResources().getDimensionPixelSize(R.dimen.gridView_param_width);
        int height = mContext.getResources().getDimensionPixelSize(R.dimen.gridView_param_height);
        GridView.LayoutParams params = new GridView.LayoutParams(width, height);
        btn.setLayoutParams(params);

    } else {
        btn = (Button) convertView;
    }

    btn.setText(list.get(position).getName());   
    btn.setId(position);
    btn.setTag(position);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            SetGridViewListener activity = (SetGridViewListener) mContext;
            activity.onClickGridView(position);              
            Button btn = (Button)v;
            btn.setBackgroundResource(R.drawable.button_shape_clicked);
            btn.setClickable(false);
        }
    });
    return btn;
}

我认为我的问题出在 getView 方法中,该方法可能无法很好地回收利用以达到我的目的。 提前致谢。

我已经解决了。我使用像这里 ListView subobject clickable confilct 这样的 ViewHolder 模式和这种方法来访问我的 activity:

中的按钮
public View getViewByPosition(int pos, GridView gridView) {
   final int firstListItemPosition = listView.getFirstVisiblePosition();
   final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

   if (pos < firstListItemPosition || pos > lastListItemPosition ) {
       return gridView.getAdapter().getView(pos, null, listView);
   } else {
       final int childIndex = pos - firstListItemPosition;
       return gridView.getChildAt(childIndex);
   }
}

(android - listview get item view by position)

如果你想要我的具体解决方案,请在评论中留言,我会添加。