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

时间:2015-05-21 11:44:10

标签: java android gridview baseadapter

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

 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方法中,这可能不适合我的目的。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我已经解决了。我使用ViewHolder模式,如ListView subobject clickable confilct和此方法来访问我的活动中的按钮:

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

如果您想要我的具体解决方案,请写下评论,我会添加它。