我有一个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);
}
答案 0 :(得分:1)
你的猜测正确,视图正在重复使用 为了解决问题,您可以添加
vi.setBackgroundColor(Color.WHITE);
topicItem.isSelected = false;
在设置侦听器之前,将其视为“默认”行为
我希望有帮助