如何从 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)
如果你想要我的具体解决方案,请在评论中留言,我会添加。
我的代码仅适用于可见视图。
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)
如果你想要我的具体解决方案,请在评论中留言,我会添加。