enter static final String[] times = new String[] {
"00:00","00:15","00:30","00:45",
"01:00","01:15","01:30","01:45",
"02:00","02:15","02:30","02:45",
"03:00","03:15","03:30","03:45",
"04:00","04:15","04:30","04:45",
"05:00","05:15","05:30","05:45",
"06:00","06:15","06:30","06:45",
"07:00","07:15","07:30","07:45",
"08:00","08:15","08:30","08:45",
"09:00","09:15","09:30","09:45",
"10:00","10:15","10:30","10:45",
"11:00","11:15","11:30","11:45",
"12:00","12:15","12:30","12:45",
"13:00","13:15","13:30","13:45",
"14:00","14:15","14:30","14:45",
"15:00","15:15","15:30","15:45",
"16:00","16:15","16:30","16:45",
"17:00","17:15","17:30","17:45",
"18:00","18:15","18:30","18:45",
"19:00","19:15","19:30","19:45",
"20:00","20:15","20:30","20:45",
"21:00","21:15","21:30","21:45",
"22:00","22:15","22:30","22:45",
"23:00","23:15","23:30","23:45",
};
List<String> timeList;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid_test);
mContext = this;
items = new int[times.length];
for (int i=0;i<times.length;i++) {
items[i] = 0;
}
timeList = new ArrayList<>(Arrays.asList(times));
gridView = (GridView) findViewById(R.id.gridview);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
R.layout.grid_block, times);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
Log.v(TAG, "pos is " + position + " id " + id);
Toast.makeText(mContext, ((TextView) v.findViewById(R.id.text1)).getText(), Toast.LENGTH_SHORT).show();
int status = items[position];
if (status == 0) {
items[position] = 1;
v.setBackgroundColor(getResources().getColor(R.color.green));
}
if (status == 1) {
items[position] = 0; v.setBackgroundColor(getResources().getColor(R.color.white));
}
}
});
}
我尝试在单击时使背景变为绿色,再次单击时将其更改为白色。即选择和未选择的指标。然而,由于一些奇怪的原因,它似乎改变了多个项目的颜色?任何帮助表示赞赏
答案 0 :(得分:1)
您的适配器正在回收网格视图以节省内存(避免为列表中的每个元素创建视图)和CPU使用率(避免为列表中的每个元素从xml中膨胀)。因此,当您滚动gridview时,它会动态尝试使用已经膨胀的视图。
如果您对视图的初始配置进行了更改(例如更改了颜色),则必须在&#34; public View getView(int position, View convertView, ViewGroup parent)&#34;中恢复该更改。您的适配器代码,负责视图的回收。如果你不这样做,它将创建具有不同颜色的视图克隆,这是你报告的奇怪行为。
请注意,当您覆盖&#34; getView&#34;代码你不想每次都膨胀一个新的视图,因为你将破坏适配器的目的及其我上面提到的优点。
代码看起来应该类似:
//convertView is the view that may be suitable to play the role of new View
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) parent.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
itemView = inflater.inflate(R.layout.grid_block, null);
} else {
itemView = convertView;
itemView.setBackgroundColor(getResources().getColor(R.color.white));
}
return itemView;
}
答案 1 :(得分:0)
创建一个SparseBooleanArray并将选择状态存储在其中。然后更新OnClick上的选择,然后在getview方法中检查布尔数组中的值并更新背景。