如何使用drawable在本地更改RecyclerView中的图像

Posted

技术标签:

【中文标题】如何使用drawable在本地更改RecyclerView中的图像【英文标题】:How to change an image in RecyclerView locally using drawable 【发布时间】:2021-03-18 20:29:36 【问题描述】:

我正在尝试使用本地可绘制图像更改 RecyclerView 中的图像。所以在项目中RecyclerView 正在从本地数据库中获取数据,当布尔列变为真时,它应该变成一个勾号。我的项目视图如下所示。

当该列为真时,时钟符号变为滴答声。这是我尝试过的代码:

我的适配器代码:

public class HawbListAdapter extends RecyclerView.Adapter<HawbListAdapter.MyViewHolder> 
    private Context context;
    private ArrayList<HawbLists> hawbLists;
    private DatabaseHelper mDatabaseHelper;

    public HawbListAdapter(Context context, ArrayList<HawbLists> hawbLists) 
        this.context = context;
        this.hawbLists = hawbLists;
    

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.hawb_list, parent, false);
        return new MyViewHolder(v);
    

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) 
        holder.Hcode.setText(hawbLists.get(position).getHawbCode());
        holder.name.setText(hawbLists.get(position).getName());

        if (hawbLists.get(position).isTick()) 
            holder.timeImage.setImageResource(R.drawable.ic_right);
        

        //Picasso.get().load(hawbLists.get(position).isTick()).into(holder.timeImage);

        //holder.timeImage.setImageResource(R.drawable.ic_right);
    

    @Override
    public int getItemCount() 
        return hawbLists.size();
    

    public static class MyViewHolder extends RecyclerView.ViewHolder 

        private TextView Hcode;
        private TextView name;
        private ImageView timeImage;


        public MyViewHolder(@NonNull View itemView) 
            super(itemView);

            Hcode = itemView.findViewById(R.id.hawbCode12345);
            name = itemView.findViewById(R.id.name_hawb_list);
            timeImage = itemView.findViewById(R.id.timeImage);

        
    

即使我正在使用它

if (hawbLists.get(position).isTick()) 
    holder.timeImage.setImageResource(R.drawable.ic_right);

其中一项为真,它仍然显示相同的时钟(等待)符号,但如果我使用这个:

if (!hawbLists.get(position).isTick()) 
    holder.timeImage.setImageResource(R.drawable.ic_right);

那么无论真假,它们都会变成刻度线。无法弄清楚我做错了什么。

【问题讨论】:

添加else部分并在其中设置未选中的图像。 【参考方案1】:

试试这个:

if (hawbLists.get(position).isTick())
     holder.timeImage.setImageResource(R.drawable.ic_right);
 else 
     holder.timeImage.setImageResource(R.drawable.ic_not_ticked);

你知道回收的概念吗?查看您在设备中的列表,看看您有多少行!现在添加一个(作为交换视图),它就是您拥有的所有视图。这意味着无论您有多少条目 (hawbLists.size()),它们都会在您滚动时创建/回收。因此,您必须考虑项目子项的所有可能情况。因为否则回收的view 不会改变view 状态并且可能会显示不相关的行为。

【讨论】:

以上是关于如何使用drawable在本地更改RecyclerView中的图像的主要内容,如果未能解决你的问题,请参考以下文章

将颜色过滤器添加到 Drawable 会更改使用相同 Drawable 的所有 Button

如何在 Fragment 中使用 Recycler View [重复]

如何动态更改 TextView 背景颜色?

根据主题更改 Drawable

使用 Recycler View 时如何在 Text To Speech 中实现错误处理

Netty对象重用:Recycler源码分析