ArrayAdapter有奇怪的结果 - Android

时间:2013-11-15 03:53:08

标签: android listadapter

我有一个创建注释框的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

1 个答案:

答案 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模式,因为查找视图也是一种可以避免的费用。