在GridView Android中无法将颜色背景设置为单个单元格

时间:2015-02-22 14:52:00

标签: android gridview

我在GridView中设置单个单元格的颜色有奇怪的问题。

问题描述: 我的gridview包含很多包含简单文本的单个单元格。我已经设置ViewHolder来维护每个单元格的某个位置。用户可以单击每个项目,然后它应该将其颜色更改为其他项目。改变颜色有效,但它也改变了未被选中的细胞的颜色。这仅在我向上和向下滚动gridview时显示。然后背景颜色变得混杂。

这是我的HintGridAdapter:

public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder viewHolder;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.chips_hint_grid, parent, false);

            viewHolder = new ViewHolder();
            viewHolder.hintTag = (TextView) convertView.findViewById(R.id.hint_tag);
            viewHolder.hintTag.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    viewHolder.hintTag.setBackgroundColor(context.getResources().getColor(R.color.color_accent));
                    chips.setText(chips.getText() + tags[position] + ", ");
                    chips.setChips();
                }
            });

            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.hintTag.setText(tags[position]);

        return convertView;
    }

    private static class ViewHolder {
        TextView hintTag;
    }

如您所见,我已将背景颜色设置为特定的hintTag。

和XMLs:

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:orientation="vertical">

    <TextView
        android:id="@+id/hint_tag"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:padding="8dp"
        android:text="@string/tag"
        android:background="@drawable/hint_button_selector"
        android:textColor="@color/grey_white_1000"
        android:textSize="12sp" />

</RelativeLayout>

这是hint_button_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/color_accent" android:state_activated="true" />
    <item android:drawable="@color/color_accent" android:state_selected="true" />
    <item android:drawable="@color/color_accent" android:state_pressed="true" />
    <item android:drawable="@color/color_accent" android:state_checked="true" />
    <item android:drawable="@color/black_opacity_55" />
</selector>

颜色变化应该在选择器中起作用,但它并不适用。

1 个答案:

答案 0 :(得分:1)

声明一个Int类型的arrayList。

ArrayList<Integer> clickedPos=new ArrayList<>();

然后将getView更新为

     public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;

            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.chips_hint_grid, parent, false);

                viewHolder = new ViewHolder();
                viewHolder.hintTag = (TextView) convertView.findViewById(R.id.hint_tag);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

 viewHolder.hintTag.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        if(!clickedPos.contains(position))
                            clickedPos.add(position);

                        viewHolder.hintTag.setBackgroundColor(context.getResources().getColor(R.color.color_accent));
                        chips.setText(chips.getText() + tags[position] + ", ");
                        chips.setChips();
                    }
                });

           if(clickedPos.contains(position))
            viewHolder.hintTag.setBackgroundColor(context.getResources().getColor(R.color.color_accent));
        else
            viewHolder.hintTag.setBackgroundColor(context.getResources().getColor(R.color.default_color));

            viewHolder.hintTag.setText(tags[position]);

            return convertView;
        }

如果再次点击,您可以添加其他条件来设置背景颜色默认值。