0

我有一个创建评论框的 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
4

1 回答 1

1

文本颜色错误,因为您没有正确处理回收视图。

最短和最简单的解决方案是删除此检查:

if (v == null)

每次都增加一个新的视图。这效率较低,但会使您的代码更易于使用。

如果您选择继续使用回收视图,解决方案是每次显式设置按钮的文本颜色和可点击性:

if (p.getJSONArray().equals("YES")) {
    ButtonListViewItem.setClickable(false);
    ButtonListViewItem.setTextColor(0xff3399FF);
} else {
    ButtonListViewItem.setClickable(true);
    ButtonListViewItem.setTextColor(0xff000000);
}

你需要这样做的原因是因为回收的视图在你离开它们的时候就被移交了,改变了属性等等。它们将不再匹配您的 XML 布局。因此,当一个以前绑定到“YES”的视图被回收时,您对文本颜色所做的更改仍然存在:文本将是蓝色的,并且按钮将不可点击。

膨胀一个新的视图可以让你每次都从一个已知的状态开始——你总会有一些东西开始与你的 XML 匹配。权衡是效率,膨胀视图相对昂贵。如果您的应用程序需要更高效,您还应该研究视图持有者模式,因为查找视图也是可以避免的费用。

于 2013-11-15T04:08:10.750 回答