首页 文章

如何在Gridview中检测点击位置的图像视图?

提问于
浏览
0

我在这里有GridViewAdapter的getView方法 .

我想要的是,每当我点击gridview中的项目时,我点击的位置的图像应该缩小,以便将其添加到购物车中 .

但是,不是缩小单击位置处的图像,而是缩小单元格的另一个图像(滚动视图时从Viewholder创建的最后一个图像) . 任何帮助是极大的赞赏 . 谢谢!!!

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        holder = null;

        Product productItem = (Product) productList.get(position);

        if (row == null) {


                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                row = inflater.inflate(R.layout.products_grid_item_layout, parent, false);
                holder = new ViewHolder();
                holder.productImage = (ImageView) row.findViewById(R.id.productImage);
                holder.detailsIcon = (ImageView) row.findViewById(R.id.detailsIcon);
                holder.productTitle = (TextView) row.findViewById(R.id.productTitle);
                holder.productSubTitle = (TextView) row.findViewById(R.id.productSubTitle);
                holder.productQuantity = (TextView) row.findViewById(R.id.productQuantity);
                holder.priceDollar = (TextView) row.findViewById(R.id.priceDollar);
                holder.priceCent = (TextView) row.findViewById(R.id.priceCent);
                holder.productCount = (TextView) row.findViewById(R.id.productCount);
                holder.productGridLayout = (RelativeLayout) row.findViewById(R.id.productGridLayout);

                row.setTag(holder);

        } else {
            holder = (ViewHolder) row.getTag();
        }



        String price = productItem.getPrice().toString();

        String[] pricearray;
        pricearray =  price.split("\\.");

        holder.productTitle.setText(productItem.getTitle().toString());
        holder.productSubTitle.setText(productItem.getSubtitle().toString());
        holder.productQuantity.setText(productItem.getVolume().toString());
        holder.priceDollar.setText(pricearray[0]+".");
        holder.priceCent.setText(pricearray[1]);


        if(productItem.getInCart()) {
            holder.productCount.setVisibility(View.VISIBLE);
            holder.productCount.setText(productItem.getVolume());
        }

        Picasso.with(context)
                .load(productItem.getImageUrl())
                .placeholder(R.drawable.favourites)
                .error(R.drawable.favourites)
                .into(holder.productImage);

        urlSlug = productItem.getUrlSlug();

        holder.detailsIcon.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final int position = currentGridView.getPositionForView(v);
                Log.e("grid position", position+"");

                Intent productDetailIntent = new Intent(context,ProductDetailActivity.class);
                productDetailIntent.putExtra("url_slug", productList.get(position).getUrlSlug());

                context.startActivity(productDetailIntent);
            }

        });

    holder.productGridLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final int position = currentGridView.getPositionForView(v);
            Log.e("grid position", position+"");


            shrinkImage();
        }

    });


        return row;
    }



public void shrinkImage(){
        // first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
        // first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
        // The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center


        ScaleAnimation fade_in =  new ScaleAnimation(1f, 0f, 1f, 0f, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 1f);
        fade_in.setDuration(1000);     // animation duration in milliseconds
        fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
        holder.productImage.startAnimation(fade_in);

        Log.e("fade","fade out");
    }

2 回答

  • 1

    您可以实现自己的自定义OnClickListener,并且可以为gridview的每个项目的每个onclick关联id / tag / position .

    item.setOnclickListener(new GridItemClick(position));
    

    下面的自定义点击事件类:

    Class GridItemClick implements View.OnClickListener
    {
         int position;
         Public GridItemClick(int position)
         {
             this.position = position;
         }
         @Override
         public onClick(View v)
         { 
             // You can add logic here for each item clicked using position of each item you passed in constructor
         }
    
    }
    

    我在开始时遇到了同样的问题,为了解决这个问题,我为视图创建了自定义clickListener,如上所述 .

  • 1

    这是因为重用膨胀视图的默认行为 . 采取临时arraylist存储点击位置并验证相同的arraylist是否包含在getView方法中的特定位置

    ArrayList<String> selectedPosition = new ArrayList<String>();
    

    现在按以下方式更新你的getView()方法:

    @Override
            public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            holder = null;
    
            Product productItem = (Product) productList.get(position);
    
            if (row == null) {
    
    
                    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                    row = inflater.inflate(R.layout.products_grid_item_layout, parent, false);
                    holder = new ViewHolder();
                    holder.productImage = (ImageView) row.findViewById(R.id.productImage);
                    holder.detailsIcon = (ImageView) row.findViewById(R.id.detailsIcon);
                    holder.productTitle = (TextView) row.findViewById(R.id.productTitle);
                    holder.productSubTitle = (TextView) row.findViewById(R.id.productSubTitle);
                    holder.productQuantity = (TextView) row.findViewById(R.id.productQuantity);
                    holder.priceDollar = (TextView) row.findViewById(R.id.priceDollar);
                    holder.priceCent = (TextView) row.findViewById(R.id.priceCent);
                    holder.productCount = (TextView) row.findViewById(R.id.productCount);
                    holder.productGridLayout = (RelativeLayout) row.findViewById(R.id.productGridLayout);
    
                    row.setTag(holder);
    
            } else {
                holder = (ViewHolder) row.getTag();
            }
    
    
    
            String price = productItem.getPrice().toString();
    
            String[] pricearray;
            pricearray =  price.split("\\.");
    
            holder.productTitle.setText(productItem.getTitle().toString());
            holder.productSubTitle.setText(productItem.getSubtitle().toString());
            holder.productQuantity.setText(productItem.getVolume().toString());
            holder.priceDollar.setText(pricearray[0]+".");
            holder.priceCent.setText(pricearray[1]);
    
    
            if(productItem.getInCart()) {
                holder.productCount.setVisibility(View.VISIBLE);
                holder.productCount.setText(productItem.getVolume());
            }
    
            Picasso.with(context)
                    .load(productItem.getImageUrl())
                    .placeholder(R.drawable.favourites)
                    .error(R.drawable.favourites)
                    .into(holder.productImage);
    
            urlSlug = productItem.getUrlSlug();
    
    
           //Added Change here...Check if arraylist contains selectedposition or not?
    
            if(selectedPosition.contains(String.valueOf(position)))
                  shrinkImage(holder.productImage);
            else
               //Nothing
    
    
    
            holder.detailsIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    final int position = currentGridView.getPositionForView(v);
                    Log.e("grid position", position+"");
    
                    Intent productDetailIntent = new Intent(context,ProductDetailActivity.class);
                    productDetailIntent.putExtra("url_slug", productList.get(position).getUrlSlug());
    
                    context.startActivity(productDetailIntent);
                }
    
            });
    
        holder.productGridLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
    
                //final int position = currentGridView.getPositionForView(v);
                //Log.e("grid position", position+"");
    
                //shrinkImage();
    
    
               //Simply store and check selectedPosition
    
               if(selectedPosition.contains(String.valueOf(position)))
                   selectedPosition.remove(String.valueOf(position));
               else
                   selectedPosition.add(String.valueOf(position));
    
               //And then update adapter
               notifyDataSetChanged();
            }
    
        });
    
    
            return row;
        }
    

    更新您的shirnkImage方法并使用通过参数传递的持有者图像的引用 .

    public void shrinkImage(ImageView productImage){
            // first 0f, 1f mean scaling from X-axis to X-axis, meaning scaling from 0-100%
            // first 0f, 1f mean scaling from Y-axis to Y-axis, meaning scaling from 0-100%
            // The two 0.5f mean animation will start from 50% of X-axis & 50% of Y-axis, i.e. from center
    
    
            ScaleAnimation fade_in =  new ScaleAnimation(1f, 0f, 1f, 0f, Animation.RELATIVE_TO_SELF, 1f, Animation.RELATIVE_TO_SELF, 1f);
            fade_in.setDuration(1000);     // animation duration in milliseconds
            fade_in.setFillAfter(true);    // If fillAfter is true, the transformation that this animation performed will persist when it is finished.
            productImage.startAnimation(fade_in);
    
            Log.e("fade","fade out");
        }
    

相关问题