【问题标题】:ImageView changes the Image after two clicksImageView 两次单击后更改图像
【发布时间】:2017-07-03 19:32:33
【问题描述】:

我的片段中有一个方法(目的是在单击后将 Listview 图像更改为另一个图像)。我在我的适配器中调用这个方法..现在当我点击那个 Imageview 时没有任何反应..当我再次点击它时它工作..(这个 Imageview 是一个播放和暂停按钮,所以当我点击它时将它转为播放图标我必须再次单击两次,依此类推...) ..

这是我在 Fragment 中的方法:

 @Override
public void imageButtonOnClick(View v, int position) {
    playPause=(ImageView)v.findViewById(R.id.playPause);
    Product m = productList.get(position);
    playPause.setImageResource(m.getPlayPauseId());
    playPause.setTag(position);
    playPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                int pos = (Integer) v.getTag();
                Product m =(Product) productList.get(pos);
                if (paused) {
                m.setPlayPauseId(R.drawable.ic_pause);
                paused=false;
                }else {
                 m.setPlayPauseId(R.drawable.ic_play);
                 paused = true;
                }
                adapter.notifyDataSetChanged();     
        }

    });
}

我在我的适配器中这样称呼它:

holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
holder.playPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          if (callback != null) {
              callback.imageButtonOnClick(v, position);
          }      
    }
});

这是我的接口和构造函数,也在我的适配器中:

public interface PlayPauseClick {
    void imageButtonOnClick(View v, int position);
}
private PlayPauseClick callback;

public void setPlayPauseClickListener(PlayPauseClick listener) {
    this.callback = listener;
}

我已经在我的 Fragment 中实现了这个接口

更新

产品类别:

public class Product implements Serializable {


@SerializedName("pid")
public int pid;

@SerializedName("name")
public String name;

@SerializedName("qty")
public int qty;

@SerializedName("price")
public String description;

@SerializedName("image_url")
public String image_url;

@SerializedName("date")
public String date;



 private int PlayPauseId;


public int getPlayPauseId() {
    return PlayPauseId;
}

public void setPlayPauseId(int playPauseId) {
    PlayPauseId = playPauseId;
 }

【问题讨论】:

  • 我觉得你需要初始化boolean paused;
  • @SelimAjimi 你没有看到我的方法
  • 能否给出Product类的代码?如果您没有按照@SelimAjimi 的建议进行特殊检查,产品可能会为已选择的资源返回相同的路径。
  • paused 在哪里初始化?它在所有 imageViews 之间共享吗?
  • @o.akrout 它在我创建方法的片段中:private boolean paused = true;

标签: android android-fragments methods interface android-adapter


【解决方案1】:

我认为您不需要向 Fragment 发送回电话以更改播放/暂停图像然后通知。简单地在你的适配器里面改变它,比如

holder.playPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Product product =(Product) productList.get(pos);
        if (product.getPlayPauseId() == R.drawable.ic_play) {
            product.setPlayPauseId(R.drawable.ic_pause);
        }else {
            product.setPlayPauseId(R.drawable.ic_play);
        }
        v.setImageResource(product.getPlayPauseId());
    }
});

更新
在你的情况下,你所有的逻辑代码都在Fragment 而不是Adapter 所以我认为你可以这样做 适配器

Product product = productList.get(position);
holder.playPause=(ImageView)v.findViewById(R.id.playPause); 
holder.playPause.setImageResource(product.getPlayPauseId());
holder.playPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
          if (callback != null) {
              // you need to pass the position, don't need pass the View 
              callback.imageButtonOnClick(position);
          }      
    }
});

片段代码

public void imageButtonOnClick(int position) {
     Product product = productList.get(position);
     if(your logic){
          product.setPlayPauseId(R.drawable.ic_play);
     }else{
          product.setPlayPauseId(R.drawable.ic_pause);
     } 
     adapter.notifyDataSetChanged();
} 

【讨论】:

  • 我的 Fragment 中有太多数据和条件,我必须在我的 Fragment 的方法中检查并传递它。如果我直接在我的适配器中设置它,我将无法访问它们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2018-06-16
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多