【问题标题】:Random images getting color changes in listview随机图像在列表视图中获得颜色变化
【发布时间】:2014-12-25 21:31:13
【问题描述】:

我的活动是一个 listView,我使用 MyAdapter 扩展它,它扩展了 BaseAdapter。我的列表视图显示了多个图像,我想添加一个滤色器效果,即已经点击的图片的颜色变化。

一开始所有的图片都按原样显示,但是当用户点击图片时,它的颜色会发生变化,这对图片的亮度影响较小,因此用户可以知道他们以前已经看过这张图片。我通过使用setColorFilter 方法来实现这一点。 并且点击后图像会发生变化。

我的问题是,当我向下滚动 listView 时,之前没有点击过的几张图片也显示了这种效果。而我希望这种效果只显示在点击的图像上。

我的代码:-

public class MyAdapter extends BaseAdapter {
         public class ViewHolder{

                ImageView image;

            }

            @Override
            public View getView( final int arg0, View arg1, ViewGroup arg2) 
            {
                View vi = arg1;
                final ViewHolder holder;
                final int type = getItemViewType(arg0);

                if(arg1==null)
                {
                    holder = new ViewHolder();

                    switch(type)
                    {
                    case 0:

                    LayoutInflater inflater = (LayoutInflater) itemlist.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    vi = inflater.inflate(R.layout.items, arg2,false);


                    holder.image = (ImageView)vi.findViewById(R.id.list_image);
                    holder.image.getLayoutParams().height=(int) (height/dpi); 

                    break;



                    }
                    vi.setTag(holder);
                }
                else{
                    holder=(ViewHolder)vi.getTag();
                }

Picasso.with(getApplicationContext())
                       .load(data.get(arg0).get(3))
                       .fit().centerCrop().into(holder.image);

 holder.image.setOnClickListener(new OnClickListener(){

                    @Override
                    public void onClick(View v)
                    {
                        // TODO Auto-generated method stub
                        holder.image.setColorFilter(0x70C6C6C6, PorterDuff.Mode.MULTIPLY);
                        Toast.makeText(getApplicationContext(), "Item"+arg0+" selected", Toast.LENGTH_SHORT).show();
                    }});
}
            return vi;

}

我做错了什么?

谢谢。

【问题讨论】:

    标签: android image listview picasso


    【解决方案1】:

    保持点击图片的状态如下。

    public View getView(int position, View view, ViewGroup parent) {
        // TODO Auto-generated method stub
        final ViewHolder holder;
        if (view == null) {
            holder = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.check, null);
            holder.mTextView = (TextView) view.findViewById(R.id.textView1);
            holder.mImageView = (ImageView) view.findViewById(R.id.checkBox1);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
    
        final MyDataBean mDataBean = arrayList.get(position);
        holder.mTextView.setText(mDataBean.getmString());
        if (mDataBean.isIschecked()) {
            holder.mImageView.setBackgroundColor(mContext.getResources().getColor(R.color.red));
        } else {
            holder.mImageView.setBackgroundColor(mContext.getResources().getColor(R.color.black));
        }
        holder.mImageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mDataBean.setIschecked(true);
                holder.mImageView.setBackgroundColor(mContext.getResources().getColor(R.color.red));
            }
        });
    
        return view;
    }
    

    【讨论】:

      【解决方案2】:

      我不知道您的 data 数组的类型,但也许您可以尝试将一些布尔值添加到您的 data 数组中,例如 isAlreadySeen这由您的 onItemClickListener 方法更改。因此,如果您的列表项中除了图像之外没有其他内容,我建议您在适配器之外使用 onItemClickListener 而不是 holder.image.setOnClickListener。然后你可以更换你的

      holder.image.setOnClickListener(new OnClickListener() {
          @Override
          public void onClick(View v) {
              // TODO Auto-generated method stub
              holder.image.setColorFilter(0x70C6C6C6, PorterDuff.Mode.MULTIPLY);
          }
      });
      

      以下代码

      if(data.get(arg0).isAlreadySeen){
          holder.image.setColorFilter(0x70C6C6C6, PorterDuff.Mode.MULTIPLY);
      }
      

      希望对你有帮助..

      【讨论】:

      • 这正是我所做的,它的工作原理。但是我一直在寻找任何其他方法,而不使用单独的变量来检查每次是否单击图像。
      • 那么我会关注这个帖子。有一个更聪明的解决方案会很好。我希望有人会来!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2019-07-08
      • 2015-03-27
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多