Как определить изображение позиции щелчка в Gridview?

У меня есть метод getView GridViewAdapter здесь.

Что я хочу здесь, так это то, что всякий раз, когда я щелкаю элемент в 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");
    }

person incr3dible noob    schedule 04.10.2016    source источник
comment
stackoverflow .com/questions/29957414/   -  person Aditya Vyas-Lakhan    schedule 04.10.2016
comment
пожалуйста, дайте мне изображение, что на самом деле вы хотите достичь?   -  person dipali    schedule 04.10.2016


Ответы (2)


Вы можете реализовать свой собственный OnClickListener и связать идентификатор/тег/позицию для каждого щелчка каждого элемента сетки.

item.setOnclickListener(new GridItemClick(position));

Пользовательский класс события Click ниже:

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 для представлений, как описано выше.

person iamabhaykmr    schedule 04.10.2016

Это происходит из-за поведения по умолчанию для повторного использования завышенного представления. Возьмите временный список массивов для сохранения позиции щелчка и проверьте тот же список массивов, содержится ли он в этой конкретной позиции или нет внутри метода 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");
    }
person Jai    schedule 04.10.2016