我使用了一个GridView,其每个Item包括一个ImageView和一个TextView,详细如下:
1、首先其Item的xml:<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_height="wrap_content" android:paddingBottom="4dip"  
    android:layout_width="fill_parent">  
    <ImageView android:layout_height="wrap_content" 
        android:id="@+id/itemImage"  
            android:layout_width="wrap_content" 
            android:layout_centerHorizontal="true" 
            android:src="@drawable/btnred">  
    </ImageView>
    <TextView android:layout_width="wrap_content"  
       android:layout_height="wrap_content"  
           android:text="01"
           android:textColor="#000000"
           android:textSize="30sp"
           android:layout_centerHorizontal="true"
           android:layout_centerVertical="true"
           android:id="@+id/itemText">
    </TextView>  
</RelativeLayout> 2、然后是Adapter:public class GridAdapter extends BaseAdapter {  
  
    private class GridHolder {  
        ImageView appImage;  
        TextView appName;
    }
    
    private Context context;  
  
    private List<GridInfo> list;
    private LayoutInflater mInflater;  
  
    public GridAdapter(Context c) {  
        super();  
        this.context = c;  
    }  
  
    public void setList(List<GridInfo> list) {  
        this.list = list;  
        mInflater = (LayoutInflater) context  
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  
    }  
  
    public int getCount() {  
        // TODO Auto-generated method stub  
        return list.size();  
    }  
  
    @Override  
    public Object getItem(int index) {
        return list.get(index);  
    }  
  
    @Override  
    public long getItemId(int index) {  
        return index;  
    }  
  
    @Override  
    public View getView(int index, View convertView, ViewGroup parent) {
        GridHolder holder;  
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.grid_item, null);     
            holder = new GridHolder();  
            holder.appImage = (ImageView)convertView.findViewById(R.id.itemImage);  
            holder.appName = (TextView)convertView.findViewById(R.id.itemText);  
            convertView.setTag(holder);
  
        }else{
             holder = (GridHolder) convertView.getTag();     
        }  
        
        GridInfo info = list.get(index);  
        if (info != null) {     
            holder.appName.setText(info.getName());  
        }  
        
        return convertView;  
    }  
  
}3、还有List class:public class GridInfo{  
    private String name;  
    
    public GridInfo(String name) {  
        super();  
        this.name = name;  
    }  
  
    public String getName(){  
        return name;
    }  
  
    public void setName(String name){  
        this.name = name;  
    }  
}4、然后我在antivity中这样加载和设置OnItemClick功能:private GridView gridview;
private List<GridInfo> list;
private GridAdapter adapter;
private boolean arrRed[]=new boolean[35];gridview = (GridView) findViewById(R.id.gridview);
        list = new ArrayList<GridInfo>();
        for(int i=0;i<35;i++){
         list.add(new GridInfo(i<9?"0"+String.valueOf(i+1):String.valueOf(i+1)));  
        }        adapter = new GridAdapter(this);  
        adapter.setList(list);
        gridview.setAdapter(adapter);
        gridview.setOnItemClickListener(new ItemClickListener());class  ItemClickListener implements OnItemClickListener{  
     public void onItemClick(AdapterView<?> a, View v, int position, long id){
    
     ImageView redRall;
     String strSelected="";
    
     if(arrRed[position]){
     //取消
     arrRed[position]=false;
     redRall= (ImageView)v.findViewById(R.id.itemImage); 
         redRall.setImageResource(R.drawable.btnred);
     }else{
     //选择
     arrRed[position]=true;
     redRall = (ImageView)v.findViewById(R.id.itemImage); 
         redRall.setImageResource(R.drawable.btnblackh);
     }
     }
    }
但是问题来了,由于GridView里的Item比较多而出现了上下滚动条(我在Layout xml里把GridView的layout_width设置为固定大小),在点击过一个Item后(Item点击后会,里面的ImageView会换一个图片),在滚动GridView时会随机出现一个Item自动换了图,而原来点击那个Item也换回了未点击的图片。不知道大家有没有遇到这个情况?现在一时解决不了,help me! 3Q

解决方案 »

  1.   

    public View getView(int index, View convertView, ViewGroup parent) {
            GridHolder holder;  
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.grid_item, null);     
                holder = new GridHolder();  
                holder.appImage = (ImageView)convertView.findViewById(R.id.itemImage);  
                holder.appName = (TextView)convertView.findViewById(R.id.itemText);  
                convertView.setTag(holder);
      
            }else{
                 holder = (GridHolder) convertView.getTag();     
            }  
            
            GridInfo info = list.get(index);  
            if (info != null) {     
                holder.appName.setText(info.getName());  
            }  
            
            return convertView;  
        }  
    改成:public View getView(int index, View convertView, ViewGroup parent) {
            GridHolder holder;  
                convertView = mInflater.inflate(R.layout.grid_item, null);     
                holder = new GridHolder();  
                holder.appImage = (ImageView)convertView.findViewById(R.id.itemImage);  
                holder.appName = (TextView)convertView.findViewById(R.id.itemText);  
                convertView.setTag(holder);
              
            GridInfo info = list.get(index);  
            if (info != null) {     
                holder.appName.setText(info.getName());  
            }  
            
            return convertView;  
        }  就好了
      

  2.   

    因为gridview,当其中的元素超出屏幕后,比如1-10个在当前屏幕,11-20个在屏幕下方,那么11-20使用的就是1-10个的对象,也就是说你改变第一个元素其实也改变了第11个元素。解决办法就是让getView中返回的view都是生成的新的view
      

  3.   

    感谢 zhouyongyang621
    由于项目的时间问题你的代码还没有试,不过应该没问题,先把分给你 呵呵
      

  4.   

    看看这样行不
    public View getView(int index, View convertView, ViewGroup parent) {
      GridHolder holder;  
      if (convertView == null) {
      convertView = mInflater.inflate(R.layout.grid_item, null);  
      } 
      holder = new GridHolder();  
      holder.appImage = (ImageView)convertView.findViewById(R.id.itemImage);  
      holder.appName = (TextView)convertView.findViewById(R.id.itemText);  
      convertView.setTag(holder);
      GridInfo info = list.get(index);  
      if (info != null) {  
      holder.appName.setText(info.getName());  
      }  
      return convertView;  
      }   
      

  5.   

    我现在还是对getView这个重载函数不太了解,什么时候会触发呢?
    rmm0001能说一下这样修改的原因吗? 谢谢
      

  6.   

    楼上的同志,zhouyongyang621的回答应该解决了问题,我试过了。