【问题标题】:Color background cannot be set to single cell in GridView Android无法在 GridView Android 中将颜色背景设置为单个单元格
【发布时间】:2015-02-22 14:52:00
【问题描述】:

我在 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;
    }

如您所见,我已将背景颜色设置为特定的提示标签。

还有 XML:

  <?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>

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

【问题讨论】:

  • “用户可以点击每个项目,然后它应该将其颜色更改为其他” - 您似乎没有任何代码来执行此操作。
  • 您必须维护一个单击位置的数组列表,然后检查 getView 位置数组是否包含当前位置,如果是则设置颜色,否则设置默认颜色。
  • @CommonsWare 它在 onClick 方法中,第一行。
  • 当细胞被回收时,你在哪里撤消改变?

标签: android gridview


【解决方案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;
        }

如果再次单击,您可以添加 else 条件以设置背景颜色默认值。

【讨论】:

  • 感谢您的回答,不幸的是这不起作用。起初它似乎有效(这就是我一开始接受它的原因),但后来它变得混杂了。
  • @kodw 我已经更新了我的答案,请检查现在只有 setOnClickListener 在设置和获取标签后放置你的 ClickListener 的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2019-07-27
  • 2019-10-21
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多