当前位置: 首页 > 知识库问答 >
问题:

从回收器的适配器设置图像查看颜色滤镜

范浩荡
2023-03-14

实际上,我尝试在一个类中设置imageView ColorFilter,该类定义了适配器avec recycle view。为此,我在我的适配器中定义了一个ImageView ArrayList,它从viewholder中存储了我的ImageView,我还在我的适配器中用一个带有position参数的自定义方法来获取它们。但它并不真的工作,当我点击我的项目,颜色过滤器是随机适用于我的recyclerviex项目:/

这是我的代码:

The adapter :

package com.ylly.hypred.process.adapter;

/**
 * Created by YLLY on 24/06/2015.
 */
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;
import com.ylly.hypred.process.recyclerView.ItemDataAtelier;
import com.ylly.hypred.R;
import com.ylly.hypred.custom.MyTextView;

import java.io.File;
import java.util.ArrayList;

public class AtelierAdapter extends RecyclerView.Adapter<AtelierAdapter.ViewHolder> {
    private ArrayList<ItemDataAtelier> itemsData;
    private Context context;

    public AtelierAdapter(ArrayList<ItemDataAtelier> itemsData, Context context) {
        this.itemsData = itemsData;
        this.context = context;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public AtelierAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                   int viewType) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_layout, null);

        // create ViewHolder

        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {

        // - get data from your itemsData at this position
        // - replace the contents of the view with that itemsData

        Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/drawable/" + itemsData.get(position).getDrawable());
        Picasso.with(context).load(R.drawable.hypred_atelier_atelier).into(viewHolder.imgViewIcon);
        viewHolder.nomAtelierTextView.setText(itemsData.get(position).getLabel());

    }

    // inner class to hold a reference to each item of RecyclerView
    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView imgViewIcon;
        public MyTextView nomAtelierTextView;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            imgViewIcon = (ImageView) itemLayoutView.findViewById(R.id.item_icon);
            nomAtelierTextView = (MyTextView) itemLayoutView.findViewById(R.id.item_layout_nom_atelier_textView);
        }
    }


    // Return the size of your itemsData (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return itemsData.size();
    }
}

我的项目数据:

package com.ylly.hypred.process.recyclerView;

import android.graphics.drawable.Drawable;
import android.widget.ImageView;

/**
 * Created by YLLY on 07/07/2015.
 */
public class ItemDataCriteres {

    private String label;
    private int drawable;
    private Boolean isActive;
    private ImageView imageView;

    public void setIsActive(Boolean isActive) {
        this.isActive = isActive;
    }

    public Boolean getIsActive() {

        return isActive;
    }

    public ItemDataCriteres(String label, int drawable){

        this.label = label;

        this.drawable = drawable;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getNomAtelier() {

        return label;
    }

    public void setDrawable(int drawable) {
        this.drawable = drawable;
    }

    public int getDrawable() {

        return drawable;
    }


    public void setImageView(ImageView imageView) {
        this.imageView = imageView;
    }

    public ImageView getImageView() {

        return imageView;
    }

}

和我的类,我在其中定义我的回收器视图和我在其中更改过滤器:

final CriteresAdapter criteresAdapter = new CriteresAdapter(itemDataDetailsEtThemes, v.getContext());
recyclerViewCriteresOne.setAdapter(criteresAdapter);

recyclerViewCriteresOne.addOnItemTouchListener(
        new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                if (!criteresAdapter.getCritere(position).getIsActive()) {
                    criteresActifs[0]++;
                    setLancerRechercheTextViewVisibility(v);
                    criteresAdapter.getImageView(position).setColorFilter(v.getResources().getColor(R.color.hypred_gris), PorterDuff.Mode.MULTIPLY);
                    criteresAdapter.getCritere(position).setIsActive(true);
                    criteresAdapter.notifyDataSetChanged();
                } else {
                    criteresActifs[0]--;
                    setLancerRechercheTextViewVisibility(v);
                    criteresAdapter.getImageView(position).clearColorFilter();
                    criteresAdapter.getCritere(position).setIsActive(false);
                    criteresAdapter.notifyDataSetChanged();
                }
            }
        }));

提前感谢您的时间:)

共有1个答案

郭德惠
2023-03-14

从可绘图文档:

默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改一个实例的状态,所有其他实例将收到相同的修改。

答案是调用Drawable.mutate()

可变可绘制对象保证不会与任何其他可绘制对象共享其状态。

我会将您的ItemTouchListener更改为以下内容:

recyclerViewCriteresOne.addOnItemTouchListener(
    new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            Drawable drawable = criteresAdapter.getImageView(position);
            drawable.mutate();
            if (!criteresAdapter.getCritere(position).getIsActive()) {
                criteresActifs[0]++;
                setLancerRechercheTextViewVisibility(v);
                drawable.setColorFilter(v.getResources().getColor(R.color.hypred_gris), PorterDuff.Mode.MULTIPLY);
                criteresAdapter.getCritere(position).setIsActive(true);
                criteresAdapter.notifyDataSetChanged();
            } else {
                criteresActifs[0]--;
                setLancerRechercheTextViewVisibility(v);
                drawable.clearColorFilter();
                criteresAdapter.getCritere(position).setIsActive(false);
                criteresAdapter.notifyDataSetChanged();
            }
        }
    }));
 类似资料:
  • 下面是我的类,它在使用Groupie时也充当 这是我在我的活动中如何使用它 下面是我的布局项目文件 这是我在

  • 我使用SearchView过滤我的应用程序的RecyclerView,就像这篇文章中描述的一样: 如何使用SearchView筛选RecyclerView 一开始一切看起来都很好,我可以根据需要过滤RecyclerView,但是经过一些尝试,出现了两个问题: 如果我在SearchView中输入文本太快,应用程序会崩溃,并出现以下日志: E/AndroidRuntime: FATAL EXCEPTI

  • 我使用此解决方案来过滤我的。使用该解决方案,我能够在键入时获得结果。但是当我清除搜索小部件时,我没有得到完整的列表,而是得到了空的。 这就是我的结果。https://imgur.com/nwyetEd 这是我的 这是我的 这是我使用过滤器的< code >活动 有人能帮助我吗?

  • 我正在寻找在Android中使用列表适配器和Recyview适配器的区别。关于性能的任何不同,使用它们的利弊。

  • 我有“E/RecyclerView:没有连接适配器;跳过布局”错误消息。我在片段中有recycleView,所以我一定是在fragment1.java上做错了什么。 这是代码。如您所见,我在代码上设置了适配器,但我收到此错误。任何帮助将不胜感激。谢谢。 公共类Fragment1扩展片段{ } 公共类圣经适配器扩展回收器View.Adapter { }

  • 嘿,我正在尝试做一个程序,它加载一个彩色图像作为灰度画布,然后返回颜色点击像素。当setrgb()方法没有做它应该做的事情时,我就被困在这里了。我已经通过getRGB()从原始图像中复制了颜色,并使用setRGB()将其分配给新图像。我试图输出两个像素颜色值,但他们不一样。请帮我解决这个问题。以下是到目前为止的代码: