我的代码仅适用于可见视图。
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方法中,这可能不适合我的目的。 提前谢谢。
答案 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)
如果您想要我的具体解决方案,请写下评论,我会添加它。