【问题标题】:ImageAdapter onClick goes wrongImageAdapter onClick 出错
【发布时间】:2013-07-31 16:32:05
【问题描述】:

我正在尝试在我的 GridView 的适配器中的 ImageView 上设置一个 onClick 侦听器。然而,奇怪的事情发生了:onClick 函数的内容也会影响我的 GridView 中的一些其他视图。

我没有在我的 GridView 上执行点击侦听器是有充分理由的,因此我需要通过 ImageAdapter 解决此问题。
logcat只在我点击一次时被调用,但由于某种原因,其他ImageViews会受到这个函数的影响。

相关代码如下:

 public View getView(final int position, View convertView, ViewGroup parent) {
       final ViewHolder holder;
       if(convertView == null) {
           holder = new ViewHolder();
           convertView = mInflater.inflate(R.layout.row_multiphoto_item, null);
          holder.tickImageView = (ImageView) convertView.findViewById(R.id.tickImageView);
          holder.imageView = (ImageView) convertView.findViewById(R.id.imageView1);
          holder.imageViewLayout = (LinearLayout)convertView.findViewById(R.id.imageViewLayout);
           convertView.setTag(holder);
       }
       else{
            holder = (ViewHolder) convertView.getTag();
       }

       holder.imageView.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    ImageView imageView = (ImageView)v;
    int id = imageView.getId();
    imageView.setVisibility(View.GONE);/*
    if(!thumbnailsselection[id]){
        Log.d(Global.TAG, "CLICK");

        holder.tickImageView.setVisibility(View.VISIBLE);
        holder.imageViewLayout.setBackgroundResource(R.drawable.imageview_selected);
        thumbnailsselection[id] = true;
    }
    else{
        holder.tickImageView.setVisibility(View.GONE);
        holder.imageViewLayout.setBackgroundResource(R.drawable.imageview_unselected);
        thumbnailsselection[id] = false;
    }
    */
}

});

           holder.imageView.setId(position);
           holder.imageViewLayout.setId(position);
           holder.tickImageView.setId(position);
           holder.imageView.setImageBitmap(thumbnails[position]);

   return convertView;
  }

        class ViewHolder {
            ImageView imageView;
            LinearLayout imageViewLayout;
            ImageView tickImageView;
            int id;
        }

【问题讨论】:

    标签: java android image view adapter


    【解决方案1】:

    在 baseAdapters 中,视图被回收。这意味着如果您将视图设置为不可见,您将在滚动时添加其他一些不可见的视图。 为避免这种情况,请务必在 getView 方法中再次设置您的视图的可见性:

    holder.imageView.setVisibility(View.VISIBLE)
    holder.imageView.setOnClickListener(new OnCl...
    

    您还必须存储每个可见性状态,以便重新评估为可见或不可见。

    【讨论】:

    • 太好了,工作!非常感谢你。不过,我仍然不明白为什么设置为不可见时其他视图会受到影响:)
    • 因为,当视图在滚动时离开屏幕时,它不会被破坏。当 scrollView 请求新视图时,Adpater 将重新使用它。它是名为 convertView 的视图。因此,如果您不更改可见性或其中的内容,则会显示旧视图。
    • 顺便说一句,这意味着它现在效率不高,因为它总是创建新视图并且不会回收,对吧?
    • 不,你仍然回收你的视图。唯一的事情是您在每次绘制时设置其子项的可见性,但这并不是真正的问题。回收的主要内容是避免创建大量视图,避免每次调用findViewById。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多