2

我有一个填充了项目的 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);
    }
});

我将不胜感激任何帮助!

4

1 回答 1

0

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

您应该定义自己的适配器类并自己管理选中/未选中状态(例如:使用具有相同数据大小的布尔数组)并通过BaseAdapter.getView(int, View, ViewGroup). 这是一个非常基础的话题,您将在Android 官方开发者门户上获得大量教程和参考资料

于 2013-04-20T20:26:36.470 回答