处理动态添加的ImageView的点击事件

Handling Click Event of ImageView which is dynamically added

代码:

 maxIndex = alItemListDetails.size();
    linItemTags = (LinearLayout) findViewById(R.id.linItemTags);
    final ImageView image = new ImageView(this);
    for (int i = 0; i < maxIndex; i++) {
        image.setLayoutParams(new android.view.ViewGroup.LayoutParams(80, 60));
        image.setMaxHeight(20);
        image.setMaxWidth(20);
        image.setTag(i);
        image.setImageResource(R.drawable.box);
        // Adds the view to the layout
        linItemTags.addView(image);
    }
    image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Common.displayToast(ItemDetailsActivity.this, "" + image.getTag());
        }
    });

从上面的代码可以看出,我动态生成了imageview,并试图处理那个Imageview的点击事件。

但是,它给我如下错误:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

因为在 linItemTags 布局中添加相同的 ImageView 对象 image 不止一次。

在 for 循环中创建 image 对象:

for (int i = 0; i < maxIndex; i++) {
        ImageView image = new ImageView(this); //<< create here
        ....
        linItemTags.addView(image);
    }
try this

maxIndex = alItemListDetails.size();
    linItemTags = (LinearLayout) findViewById(R.id.linItemTags);

    for (int i = 0; i < maxIndex; i++) {
     ImageView image = new ImageView(this);
        image.setLayoutParams(new android.view.ViewGroup.LayoutParams(80, 60));
        image.setMaxHeight(20);
        image.setMaxWidth(20);
        image.setTag(i);
        image.setImageResource(R.drawable.box);
        // Adds the view to the layout
        linItemTags.addView(image);
        image.setOnClickListener(new ImageClickLIstener(i));

    }

    class ImageClickLIstener implements OnClickListener
    {
    int position;
    ImageClickLIstener()
    {
    this.position= position;
    }

        @Override
        public void onClick(View v) {
            Common.displayToast(ItemDetailsActivity.this, "" + position);
        }
    }