【问题标题】:GridView OnItemClickListener - how to grayscale other itemsGridView OnItemClickListener - 如何灰度化其他项目
【发布时间】:2015-08-21 01:13:37
【问题描述】:

我有网格视图,其中显示了一些使用毕加索库下载的图片。我的目标是:当我点击一些图片时,其他的应该是灰度的。但我不知道如何实现这一点。

我的 GridViewAdapter:

public class GridViewAvatarAdapter extends ArrayAdapter<AvatarItem> {

    private Context mContext;
    private int layoutResourceId;
    private ArrayList<AvatarItem> mGridData = new ArrayList<AvatarItem>();

    public GridViewAvatarAdapter(Context mContext, int layoutResourceId, ArrayList<AvatarItem> mGridData) {
        super(mContext, layoutResourceId, mGridData);
        this.layoutResourceId = layoutResourceId;
        this.mContext = mContext;
        this.mGridData = mGridData;
    }



    public void setGridData(ArrayList<AvatarItem> mGridData) {
        this.mGridData = mGridData;
        notifyDataSetChanged();
    }

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

        if (row == null) {
            LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.imageView = (ImageView) row.findViewById(R.id.grid_item_avatar_image);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }

        AvatarItem item = mGridData.get(position);
        Picasso.with(mContext).load(item.getAvatarURL()).transform(new CircleTransform()).into(holder.imageView);

        return row;
    }

    static class ViewHolder {
        ImageView imageView;
    }


}

我知道我应该使用:

mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

            //Get item at position
            AvatarItem item = (AvatarItem) parent.getItemAtPosition(position);


        }
    });

在我的 GridView 片段中。我也知道如何使 imageView 灰度化,但我不知道在 mGridView.setOnItemClickListener() 中更改 ImageView(在 gridView 片段中)

【问题讨论】:

    标签: android gridview onclicklistener grayscale


    【解决方案1】:

    如果你试图设置一切,但你点击的那个我会做这样的事情

    mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    
                //Get item at position
                gridViewadapter.itemClicked(position);
    
            }
        });
    

    那么你的适配器就是这个

    public class GridViewAvatarAdapter extends ArrayAdapter<AvatarItem> {
    
        private Context mContext;
        private int layoutResourceId;
        private int currentSelectedItem = -1;
        private ArrayList<AvatarItem> mGridData = new ArrayList<AvatarItem>();
    
        public GridViewAvatarAdapter(Context mContext, int layoutResourceId, ArrayList<AvatarItem> mGridData) {
            super(mContext, layoutResourceId, mGridData);
            this.layoutResourceId = layoutResourceId;
            this.mContext = mContext;
            this.mGridData = mGridData;
        }
    
        public void itemClicked(int position)
        {
             currentSelectedItem = position;
             notifyDataSetChanged();
        }
    
    
        public void setGridData(ArrayList<AvatarItem> mGridData) {
            this.mGridData = mGridData;
            notifyDataSetChanged();
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            final ViewHolder holder;
    
            if (row == null) {
                LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
                row = inflater.inflate(layoutResourceId, parent, false);
                holder = new ViewHolder();
                holder.imageView = (ImageView) row.findViewById(R.id.grid_item_avatar_image);
                row.setTag(holder);
            } else {
                holder = (ViewHolder) row.getTag();
            }
    
            AvatarItem item = mGridData.get(position);
            Picasso.with(mContext).load(item.getAvatarURL()).transform(new CircleTransform()).into(holder.imageView);
    
            if(currentSelectedItem != -1 && currentSelectedItem != position)
            {
              //MAKE IMAGE GRAYSCALE HERE
            }
            else
            {
              //MAKE IMAGE COLOR HERE
            }
            return row;
        }
    
        static class ViewHolder {
            ImageView imageView;
        }
    
    
    }
    

    然后,当您想将它们全部重置为颜色时,您可以使用 -1 调用 itemClicked

    【讨论】:

    • 您的解决方案有问题,因为当我单击项目时 getView() 方法(来自适配器)没有调用。知道如何强制它吗?
    • 这没有意义,notifyDataSetChanged();应该强制它刷新并获取视图。
    • 你能确定 itemClicked 被调用了吗
    • 哦,我的错。我忘了放置 notifyDataSetChanged();在 ItemClicked() 方法中。现在它完美地工作了;)非常感谢。
    【解决方案2】:

    另一个没有将该逻辑嵌入适配器的选项是:

    mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                int numberOfViews = parent.getCount();
                for(int i = 0; i < numberOfViews; i++) {
                    //If i is not the image you clicked
                    if(i != position) { 
                        AvatarItem item = (AvatarItem) parent.getItemAtPosition(i);
                        //Run whatever function that converts to greyscale
                        item.toGreyScale(); 
                    }
                }
                //Get item at position
                AvatarItem item = (AvatarItem) parent.getItemAtPosition(position);
    
                //Run whatever function you want to on the clicked item
                item.doSomething(); 
    
            }
    });
    

    【讨论】:

    • 如果我在适配器之外,我不知道如何获取项目的 imageView。然后 item.toGreyScale();不起作用,因为在“项目”中我只存储了我将下载的照片的 URL,有些无关紧要。
    • 那你能把AvatarItem的代码贴出来吗?因为我不清楚为什么您使用自定义对象的适配器而不是图像视图的适配器。
    • 没关系,我解决了我的问题 :) 感谢您的宝贵时间。
    猜你喜欢
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多