滚动时Gridview项目上的背景资源

时间:2013-04-20 19:34:07

标签: android android-layout android-gridview android-resources

我有一个GriView,其中填充了项目,并且在单击gridview上的项目时,我将后台资源更改为我在res文件夹中的图像。我的问题是当滚动并返回到所选项目时,它不再具有后台资源。相反,gridview的其他一些项目获得背景。

在我的onCreate方法中,我有以下代码来填充我的GridView:

编辑根据我的建议,我创建了一个自定义适配器并填充了gridview。我现在遇到的问题是,现在我的gridView元素都没有填充。当我设置我的适配器时,我传递一个布尔数组和一个数据数组。数据数组包含应该用于填充GridView的所有数据,而布尔数组用于确定是否已选择网格项。

编辑:已经选中的GridView元素现在甚至在滚动后也会突出显示,但现在其他从未被选中的元素似乎都会突出显示。

这是适配器类:

public class HoursAdapter extends BaseAdapter {

    private Context mContext;
    private boolean isSelected[];
    private String hours[];
    public HoursAdapter(Context c, boolean selected[], String hours[]){
        this.isSelected = selected;
        this.mContext = c;
        this.hours = hours;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return hours.length;
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;
         if(convertView==null){
            LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.hourview_item, null);
            holder = new ViewHolder();
            holder.hours =(TextView) convertView.findViewById(R.id.hours_text);
            convertView.setTag(holder);
         }else{
            holder = (ViewHolder)convertView.getTag(); 
         }
         if(isSelected[arg0-1])
          holder.hours.setBackgroundResource(R.drawable.item_background_focused);

         holder.hours.setText(hours[arg0-1]);
        return convertView;
    }

    static class ViewHolder{
        TextView hours;
    }


}

这是我设置适配器的代码:

    HoursAdapter adapter = new HoursAdapter(this,isSelected,data);


    hoursView.setAdapter(adapter);

hoursView.setOnItemClickListener(new OnItemClickListener() {


    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position,
            long id) {
        // TODO Auto-generated method stub
        v.setBackgroundResource(R.drawable.item_background_focused);
    }
});

我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

好像你没有考虑视图回收如何在适配器中工作。使用适配器视图在滚动期间被回收,这是用于渲染您刚刚单击的项目的相同视图,应该在滚动操作后重新用于渲染另一个项目。

您应该自己定义自己的适配器类并管理所选/未选择的状态(例如:使用具有相同数据大小的布尔数组)并通过BaseAdapter.getView(int, View, ViewGroup)正确设置/重置背景。这是一个非常基本的主题,您将在Official Android Developers Portal

上获得大量的教程和参考