2

我有一个GriView,里面填充了项目,点击gridview上的项目我将背景资源更改为res文件夹中的图像。我的问题是滚动和回到选定的项目,它不再有背景资源。相反,一些gridview的其他项目获取背景。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); 
    } 
}); 

我将不胜感激任何帮助!

回答

0

好像你并没有考虑视图回收在适配器中是如何工作的。在滚动过程中使用适配器视图进行回收,即用于呈现刚刚单击的项目的相同视图应在滚动操作后重新用于呈现其他项目。

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

+0

所以每次我滚动视图得到回收我猜。所以当我最初通过构造函数设置适配器时,我需要传递布尔数组吗?因为我认为只有在最初设置gridview并使用项目填充它时才调用适配器类。 – AndroidDev93 2013-04-20 20:34:01

+0

只有从视口出来的视图才会被回收。该适配器被调用一次,是正确的,但你需要弄清楚它是如何工作的,以实现你想要的。例如http://developer.android.com/guide/topics/ui/layout/gridview.html涵盖了关于这方面的基本信息。 – 2013-04-20 20:44:04

+0

我做了一些修改并创建了我自己的适配器。我读到,我们必须创建自己的视图持有者,并使用get/set标签来跟踪哪些项目具有背景资源。但是现在我的gridView中没有任何项目被填充。我在上面的代码中添加了更改。 – AndroidDev93 2013-04-20 21:05:09