在GridView / ListView中选择单元格时,它也会选择另一个单元格

时间:2011-02-11 20:48:57

标签: android

我有一个GridView,其中每个单元格包含一个ImageView和TextView。当用户单击某个单元格时,它会将该单元格的背景颜色更改为灰色。但是,当我向下滚动时,还会选择另一个单元格(即背景颜色为灰色)。

我的猜测是,这是因为单元格重新使用与向下滚动时隐藏的单元格相同的视图。

当我改变方向时也会发生这种情况。如果我选择单元格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 个答案:

答案 0 :(得分:1)

你的猜测正确,视图正在重复使用 为了解决问题,您可以添加

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

在设置侦听器之前,将其视为“默认”行为

我希望有帮助