我有一个创建注释框的ArrayAdapter类。评论框中有一个按钮,可以是蓝色或黑色。按钮的颜色取决于通过JSON接收的数组。如果数组看起来像"NO","NO","YES","NO","NO","NO"
,则第三个按钮将具有蓝色文本。我的JSON和ArrayAdapter类一次创建7个注释框。问题是一旦代码将按钮更改为蓝色,它会不断更改按钮蓝色。我的意思是,如果收到一个看起来像这个"NO","NO","YES","NO","NO","NO"
的数组,第三个按钮将是蓝色的,那么我会收到另一组注释,所以这次数组看起来像这个"NO","NO","NO","NO","NO","NO"
根据这个代码没有按钮应为蓝色,但由于某种原因,第三个按钮仍为蓝色。我可以加载多组注释,第三个按钮将始终为蓝色,即使代码清楚地表明它应该是黑色的。奇怪的是,按钮会呈蓝色,但就像是黑色按钮一样。这是我的ArrayAdapter,
class ListAdapter extends ArrayAdapter<Item> {
public ListAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
private List<Item> items;
public ListAdapter(Context context, int resource, List<Item> items) {
super(context, resource, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi;
vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.list_item_layout, null);
}
final Item p = items.get(position);
if (p != null) {
//set xml objects
//must be done inside of class
ButtonListViewItem = (TextView) v.findViewById(R.id.button_listview_item);
if(p.getJSONArray().equals("NO")){
ButtonListViewItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ButtonListViewItem.setTextColor(0xff000000);
new AsyncTask().execute();
}//end on click
});
}//end if equals NO
if(p.getJSONArray().equals("YES")){
ButtonListViewItem.setClickable(false);
ButtonListViewItem.setTextColor(0xff3399FF);
}//end if equals yes
}//end if null
return v;
}//end getView
}//end ListAdapter class
答案 0 :(得分:1)
文本颜色错误,因为您没有正确处理回收的视图。
最简单和最简单的解决方案是删除此检查:
if (v == null)
每次都会为新视图充气。效率较低,但会使您的代码更易于使用。
如果您选择继续使用循环视图,解决方案是每次都明确设置按钮的文本颜色和可点击性:
if (p.getJSONArray().equals("YES")) {
ButtonListViewItem.setClickable(false);
ButtonListViewItem.setTextColor(0xff3399FF);
} else {
ButtonListViewItem.setClickable(true);
ButtonListViewItem.setTextColor(0xff000000);
}
您需要这样做的原因是因为回收的视图会在您离开它们,更改属性和所有内容时被移交。它们将不再符合您的XML布局。因此,当以前绑定到“是”的视图被回收时,您对文本颜色所做的更改仍然存在:文本将为蓝色,按钮将无法单击。
膨胀新视图允许您每次都以已知状态启动 - 您将始终拥有一些与XML匹配的东西。权衡是效率,膨胀的观点相对昂贵。如果您的应用需要更高效,那么您也应该考虑the view holder模式,因为查找视图也是一种可以避免的费用。