gridview android单击以更改背景

时间:2016-02-24 13:06:24

标签: android gridview

enter static final String[] times = new String[] {
        "00:00","00:15","00:30","00:45",
        "01:00","01:15","01:30","01:45",
        "02:00","02:15","02:30","02:45",
        "03:00","03:15","03:30","03:45",
        "04:00","04:15","04:30","04:45",
        "05:00","05:15","05:30","05:45",
        "06:00","06:15","06:30","06:45",
        "07:00","07:15","07:30","07:45",
        "08:00","08:15","08:30","08:45",
        "09:00","09:15","09:30","09:45",
        "10:00","10:15","10:30","10:45",
        "11:00","11:15","11:30","11:45",
        "12:00","12:15","12:30","12:45",
        "13:00","13:15","13:30","13:45",
        "14:00","14:15","14:30","14:45",
        "15:00","15:15","15:30","15:45",
        "16:00","16:15","16:30","16:45",
        "17:00","17:15","17:30","17:45",
        "18:00","18:15","18:30","18:45",
        "19:00","19:15","19:30","19:45",
        "20:00","20:15","20:30","20:45",
        "21:00","21:15","21:30","21:45",
        "22:00","22:15","22:30","22:45",
        "23:00","23:15","23:30","23:45",
};
List<String> timeList;
Context mContext;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_grid_test);
    mContext = this;
    items = new int[times.length];
    for (int i=0;i<times.length;i++) {
        items[i] = 0;
    }
    timeList  = new ArrayList<>(Arrays.asList(times));

    gridView = (GridView) findViewById(R.id.gridview);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.grid_block, times);

    gridView.setAdapter(adapter);
    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                                int position, long id) {
            Log.v(TAG, "pos is " + position + " id " + id);
            Toast.makeText(mContext, ((TextView) v.findViewById(R.id.text1)).getText(), Toast.LENGTH_SHORT).show();
            int status = items[position];
            if (status == 0) {
                items[position] = 1;
                v.setBackgroundColor(getResources().getColor(R.color.green));
            }
            if (status == 1) {
                items[position] = 0;                           v.setBackgroundColor(getResources().getColor(R.color.white));
            }
        }
    });

    }

我尝试在单击时使背景变为绿色,再次单击时将其更改为白色。即选择和未选择的指标。然而,由于一些奇怪的原因,它似乎改变了多个项目的颜色?任何帮助表示赞赏

2 个答案:

答案 0 :(得分:1)

您的适配器正在回收网格视图以节省内存(避免为列表中的每个元素创建视图)和CPU使用率(避免为列表中的每个元素从xml中膨胀)。因此,当您滚动gridview时,它会动态尝试使用已经膨胀的视图。

如果您对视图的初始配置进行了更改(例如更改了颜色),则必须在&#34; public View getView(int position, View convertView, ViewGroup parent)&#34;中恢复该更改。您的适配器代码,负责视图的回收。如果你不这样做,它将创建具有不同颜色的视图克隆,这是你报告的奇怪行为。

请注意,当您覆盖&#34; getView&#34;代码你不想每次都膨胀一个新的视图,因为你将破坏适配器的目的及其我上面提到的优点。

代码看起来应该类似

//convertView is the view that may be suitable to play the role of new View
public View getView(int position, View convertView, ViewGroup parent) {    
    View itemView = null;

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) parent.getContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        itemView = inflater.inflate(R.layout.grid_block, null);
    } else {
        itemView = convertView;
        itemView.setBackgroundColor(getResources().getColor(R.color.white));
    }
    return itemView;
}

答案 1 :(得分:0)

创建一个SparseBooleanArray并将选择状态存储在其中。然后更新OnClick上的选择,然后在getview方法中检查布尔数组中的值并更新背景。