10

我有一个 GridView,每个单元格都包含一些文本,我希望能够设置单个单元格的背景颜色。

我的 GridView 的 XML 是:

<GridView android:id="@+id/students_grid"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:numColumns="6"
          android:gravity="center"
          android:stretchMode="columnWidth">
</GridView>

我的 GridView 的代码是:

GridView gridView = (GridView) findViewById(R.id.students_grid);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, student_array);
gridView.setAdapter(adapter);

我曾希望我能够使用以下方法设置单个单元格的背景颜色:

gridView.getChildAt(random_student).setBackgroundColor(Color.parseColor("#18A608"));

但是,这会引发空指针异常,进一步检查似乎 gridview.getChildCount() 返回 0。我已经看到 gridview.getCount 正确返回了 gridview 中的项目数,但这无助于我设置单个单元格的背景颜色。

有什么想法我接下来要去哪里吗?

4

3 回答 3

10

解决这个问题的关键是首先了解如何ListViewGridView工作。GridView上下滚动时创建和销毁子视图。如果您在 a 中看不到一个项目,GridView这意味着它没有子视图,它将在用户实际滚动到它时创建。GridView使用 anAdapter创建视图并GridView在它们离开屏幕时回收视图,并要求适配器将回收的视图重用于屏幕上的新视图。通常Adapter会膨胀资源布局以创建新视图。

所以这意味着每次它想在屏幕上显示一个子视图时都会调用它,它可能会传递一个GridView名为.getView(...)AdapterconvertView

解决方案是覆盖getView(...),调用 super 以正常Adapter创建并使用数组中的数据填充视图,String但在最后添加一些代码,然后我们将视图返回给GridView设置视图的颜色。

new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, student_array) {
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

    int color = 0x00FFFFFF; // Transparent
    if (someCondition) {
      color = 0xFF0000FF; // Opaque Blue
    }

    view.setBackgroundColor(color);

    return view;
  }
};
于 2014-06-27T17:47:05.830 回答
4

您必须创建十六进制颜色代码数组并传递给自定义适配器类的主要活动

public class MainActivity extends Activity {
GridView gridView;


    String[] gridColor ={

            "#008B8B",
            "#00FF00",
            "#48D1CC",
            "#556B2F",
            "#696969",
            "#6B8E23",
            "#8FBC8F",
            "#AFEEEE",
            "#B8860B",
            "#BDB76B",
            "#D8BFD8",
            "#DEB887",
            "#FFFF00",
            "#FFF0F5",
            "#EE82EE",
            "#DC143C",
            "#C0C0C0"
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Grid adapter = new Grid(MainActivity.this,gridColor);
        gridView=(GridView)findViewById(R.id.grid_view);

        gridView.setAdapter(adapter);


        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id)
            {
                Toast.makeText(MainActivity.this, "You Clicked On " +gridcolor[+ position], Toast.LENGTH_SHORT).show();

            }
        });

    }

}

在自定义适配器代码将是这样的,其中颜色代码将被解析

public class Grid extends BaseAdapter {

    private Context mContext;
    private final String[] menu;
    private final int[] Imageid;
    private final String[] gridcolor;

    public Grid(Context context,String[] menu,int[] Imageid,String[] gridcolor)
    {
        mContext=context;

        this.gridcolor=gridcolor;
    }

    @Override
    public int getCount() {
        return gridcolor.length;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        View grid;
        LayoutInflater inflater = (LayoutInflater) mContext
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (view == null) {

            grid = new View(mContext);
            grid = inflater.inflate(R.layout.grid_layout, null);

            grid.setBackgroundColor(Color.parseColor(gridcolor[i]));

        } else
        {
            grid =  view;
        }

        return grid;
    }
}
于 2016-01-09T08:52:21.113 回答
-1

您需要创建一个自定义布局并在您的适配器中使用它而不是android.R.layout.simple_list_item_1. 例如:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:background="#18A608"
     />

(我只是复制了最新版本simple_list_item_1.xml并在最后添加了新的背景颜色。)

将此保存为grid_layout.xmlinres/layout并将适配器的构造函数更改为:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.grid_layout, student_array);
于 2012-10-14T19:55:59.657 回答