【问题标题】:Setting image resourse by obtaining tag position for an imageview android通过获取imageview android的标签位置来设置图像资源
【发布时间】:2015-01-20 12:14:18
【问题描述】:

我正在使用回收站视图。我有一个以浅红色突出显示的布局,此布局包含在回收站视图中的每个项目中。浅红色布局放置在背景图像上。我正在使用 setTag 方法来识别红色布局中按钮的点击。当我点击我得到位置时,它工作正常。问题是我想在特定位置更改图像。 例如:考虑心脏按钮。我已经在上面设置了这样的标签。

heartButton = findViewById(id); heartButton.setTag(position);

现在我通过使用 getTag 方法获得位置。但现在我想在特定位置更改 heartButton 的图像。有没有类似的东西

heartButton.getTag(position).setImageResouce(drawable);

如果不是,那我该怎么做。

【问题讨论】:

    标签: java android listview android-recyclerview


    【解决方案1】:

    【讨论】:

    • 我还是没明白。一个代码 sn-p 或示例会很棒。
    • heartButton.setBackgroundResource(R.drawable.XXX) 方法setTag()getTag() 用于在ViewContainerViewGroup 中查找View。你不需要在这里使用它
    • 如果我想改变位置 3 的 heartbutton 的 imageResource 怎么办呢?我没有得到你的答案
    • 您必须找到确切的 heartButton。要按标签搜索View(一个heartButton),您可以使用findViewWithTag("tag") 方法(View 类的静态方法)。但要小心,标签必须是唯一的。当你找到一个View(一个heartButton)你调用setBackgroundResource()方法就可以了。
    • 就像我说的标签必须是唯一的,所以尝试这样设置标签:心脏使用heart.setTag("heart_" + position);,箭头使用arrow.setTag("arrow_" + position)
    【解决方案2】:

    正确的做法是, 您必须将心形按钮的状态存储在传递给自定义适配器的模型(POJO)中。 例如

    class ModelListItem{
    public static final int HEART=1,BROKEN_HEART=2;
    
    int heartButtonState;
    
    }
    

    现在在心形按钮的 onClick() 中,使用位置从适配器获取该对象,考虑到您已经弄清楚如何从心形按钮保留位置

    ModelListItem item = (ModelListItem)adapter.getItem(position)
    

    改变心形按钮的状态;

    item.setHeartButtonState(ModelListItem.BROKEN_HEART);
       adapter.notifyDatasetChanged();
    

    您已经知道下面的解释,但以防万一 要正常工作,在适配器的 getView 方法中,您需要检查 heartButtonState();并使用适当的图像资源。

    getView(BOILERPLATE){
     BOILERPLATE
    
     switch(item.getheartButtonState()){
     case ModelItemList.HEART:
       heartbutton.setImageResource(heart_image);
     break;
     case ModelItemList.BROKEN_HEART:
       heartbutton.setImageResource(broken_heart_image);
     break;  
     } 
    

    【讨论】:

    • 我在 Recycler's Adapter 中找不到 getItem()
    【解决方案3】:

    我制作了一个自定义点击监听器并在 setter getter 中更新了类似内容。但这仅在视图被移出视图时才有效(我认为它是 scrapeview)

    Setter Getter 类

    public class DemoData {
    
        int background;
        boolean liked;
    
        public DemoData(int background) {
            this.background = background;
        }
    
        public int getBackground() {
            return background;
        }
    
    //    public void setBackground(int background) {
    //        this.background = background;
    //    }
    
        public boolean isLiked() {
            return liked;
        }
    
        public void setLiked(boolean liked) {
            this.liked = liked;
        }
    }
    

    回收站视图的onBindViewHolder函数

    @Override
        public void onBindViewHolder(ViewHolder holder, int position) {
    
    
            background = (ImageView) holder.view.findViewById(R.id.image);
            layout = (LinearLayout) holder.view.findViewById(R.id.layout);
    
            delete = (ImageView) layout.findViewById(R.id.delete);
            lock = (ImageView) layout.findViewById(R.id.lock);
    
    
            delete.setTag("delete_"+position);
            lock.setTag("lock_"+position);
    
            if(Constants.demoDatas.get(position).isLiked()){
                delete.setImageResource(R.drawable.ic_launcher);
            }
            else{
                delete.setImageResource(android.R.drawable.ic_delete);
            }
    
            delete.setOnClickListener(new CustomClickListener(position));
            lock.setOnClickListener(new CustomClickListener(position));
    
    
    
        }
    

    自定义点击监听如下

    public class CustomClickListener implements View.OnClickListener {
    
        int position;
    
    
        public CustomClickListener(int position) {
    
            this.position = position;
        }
    
        @Override
        public void onClick(View v) {
    
            String tag = (String) v.getTag();
            String identifier[] = tag.split("_");
    
            // this line saves my state in the Setter Getter Class
            Constants.demoDatas.get(position).setLiked(true);
    
        }
    }
    

    【讨论】:

    • 上述解决方案工作正常,但图像不会立即更新,只有在我们滚动 recyclerView 时才会更新。有谁知道这个???
    • Sagar,上面的解决方案和我的一样,只是在 setLiked() 完成后添加通知数据集更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 2018-01-21
    • 2013-02-25
    相关资源
    最近更新 更多