2011-02-11 109 views
1

我有一個GridView,其中每個單元格包含一個ImageView和TextView。當用戶單擊一個單元格時,它將該單元格的背景顏色更改爲灰色。但是,當我向下滾動時,也會選擇另一個單元(即背景顏色爲灰色)。當在GridView/ListView中選擇一個單元格時,它也會選擇另一個單元格

我的猜測是,這是因爲單元格重用與滾動時隱藏的單元格相同的視圖。

當我更改方向時也會發生這種情況。如果我選擇單元格1,當我改變方向時,現在選擇另一個單元格,而單元格1不是。

在此先感謝。

public class LazyFeaturedTopicItemAdapter extends BaseAdapter { 

private Activity activity; 
private ArrayList<Topic> topics; 
private static LayoutInflater inflater=null; 
public PostItemImageLoader imageLoader; 

public LazyFeaturedTopicItemAdapter(Activity a, ArrayList<Topic> d) { 
    activity = a; 
    topics=d; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader=new PostItemImageLoader(activity.getApplicationContext()); 
} 

public int getCount() { 
    return topics.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder{ 
    public ImageView imgThumbnail; 
    public TextView txtName; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    ViewHolder holder; 

    final Topic topicItem = topics.get(position); 

    if(convertView==null){ 
     vi = inflater.inflate(R.layout.featured_topic_item, null); 
     holder=new ViewHolder(); 
     holder.txtName = (TextView) vi.findViewById(R.id.featured_topic_item_name); 
     holder.imgThumbnail = (ImageView)vi.findViewById(R.id.featured_topic_item_thumbnail); 

     vi.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)vi.getTag(); 
     holder.txtName.setText(topicItem.getName());          

    holder.imgThumbnail.setTag(topicItem.getPictureLink()); 
    imageLoader.DisplayImage(topicItem.getPictureLink(), activity, holder.imgThumbnail); 

    vi.setOnClickListener(
      new View.OnClickListener() { 

       @Override 
       public void onClick(final View v) { 

        if (topicItem.isSelected) { 
         v.setBackgroundColor(Color.WHITE); 
         topicItem.isSelected = false; 
        } 
        else { 
         v.setBackgroundColor(Color.GRAY); 
         topicItem.isSelected = true; 
        } 
       } 

      } 
    ); 
    return vi; 
} 
} 

這是解決方案,以防有人感興趣。我在偵聽器之前添加了以下代碼。

if (topicItem.isSelected) { 
     vi.setBackgroundColor(Color.GRAY); 
    } 
    else { 
     vi.setBackgroundColor(Color.WHITE); 
    } 

回答

1

你是對你的猜測,認爲是被重用 爲了解決這個問題,你可以只設置在監聽前加

vi.setBackgroundColor(Color.WHITE); 
topicItem.isSelected = false; 

,把它看成是「默認」行爲

我希望可以幫助

+0

很好的答案! 我剛剛更新了上面的問題。非常感謝你。 – dannyroa 2011-02-11 21:22:59

相關問題