【问题标题】:set onClickListener on Imageview(Listview) inside activity在活动内部的 Imageview(Listview) 上设置 onClickListener
【发布时间】:2017-07-02 17:17:10
【问题描述】:

有没有办法在活动中的 Imageview(Listview) 上设置 onClickListener ? 我已经创建了这个,它在我的适配器中工作得很好,但它在我的活动中不起作用:

    @Override
   public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

    playPause=(ImageView)view.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 =productList.get(pos);
                 if (paused) {
                 m.setPlayPauseId(R.drawable.ic_pause);
                 paused=false;
                 }else {
                  m.setPlayPauseId(R.drawable.ic_play);
                  paused = true;
                }    
                 adapter.notifyDataSetChanged();
            }

        });

    }

这是我的产品类:

public class Product implements Serializable {

private int PlayPauseId;

@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;



public int getPlayPauseId() {
    return PlayPauseId;
}

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

  }

适配器类(Fundapter 库):

public class FunDapter<T> extends BaseAdapter implements Filterable {

protected List<T> mDataItems;
protected List<T> mOrigDataItems;
protected LongExtractor<T> idExtractor;
protected final Context mContext;
private final int mLayoutResource;
private final BindDictionary<T> mBindDictionary;
private int oddColorRes;
private int evenColorRes;
private FunDapterFilter<T> funDapterFilter;
private Filter mFilter;



public FunDapter(Context context, List<T> dataItems, int layoutResource,
                 BindDictionary<T> dictionary) {
  this(context, dataItems, layoutResource, null, dictionary);
}


public FunDapter(Context context, List<T> dataItems, int layoutResource,
                 LongExtractor<T> idExtractor, BindDictionary<T> dictionary) {
    this.mContext = context;
    this.mDataItems = dataItems;
    this.mOrigDataItems = dataItems;
    this.mLayoutResource = layoutResource;
    this.idExtractor = idExtractor;
    this.mBindDictionary = dictionary;

}


public void updateData(List<T> dataItems) {
    this.mDataItems = dataItems;
    this.mOrigDataItems = dataItems;
    notifyDataSetChanged();
}

@Override
public int getCount() {
    if (mDataItems == null || mBindDictionary == null) return 0;

    return mDataItems.size();
}

@Override
public T getItem(int position) {
    return mDataItems.get(position);
}

@Override
public boolean hasStableIds() {
    if(idExtractor == null) return super.hasStableIds();
    else return true;
}

@Override
public long getItemId(int position) {
    if(idExtractor == null) return position;
    else return idExtractor.getLongValue(getItem(position), position);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {


    View v = convertView;
    final GenericViewHolder holder;
    if (null == v) {
        LayoutInflater vi =
                (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(mLayoutResource, null);
        holder = new GenericViewHolder();
        holder.root = v;





        FunDapterUtils.initViews(v, holder, mBindDictionary);

        v.setTag(holder);


    } else {
        holder = (GenericViewHolder) v.getTag();
    }



    final T item = getItem(position);
    showData(item, holder, position);




    return v;
}

【问题讨论】:

  • 您可以在您的适配器类的 getView 方法中设置它。当您在单击时设置单击时,上面将不起作用,单击列表视图的项目。
  • 我认为删除onItemClick并直接在适配器的onBindViewHolder中设置imageview的点击
  • @JunaidHafeez 我知道它可能不起作用..但我坚持在我的活动中这样做
  • 发送您的完整适配器代码
  • @ZakiPathan 无法直接设置它,因为我不知道如何获得该位置......而且我已经说过它可以在我的适配器中使用。

标签: android listview onitemclicklistener


【解决方案1】:

您可以通过两种方式做到这一点: 制作一个类似这样的界面

public interface ImageClick {
   public imageButtonOnClick(View view, int position)
} 

在你的活动中实现它,在你的适配器getView中,设置imageOnClickListener,并在onClick中调用这个接口方法,传递你的位置和视图,这样你就可以在你的活动中使用位置等回调。

其次是在你的活动中创建一个方法,就像在界面中一样

public imageButtonOnClick(View view, int position)

在 imageView 上的适配器 onClick 方法中,将其命名为

((YourActivity)context).imageButtonOnClick(params1, param2);

【讨论】:

  • 看来你的解决方案会起作用,因为我是android新手,你能不能用一个例子解释更多你的方式“一个”!?,我会接受你的回答
  • 在我编辑和添加细节之前,我已经找到了一个很好的例子,正是我所说的。看到这个stackoverflow.com/a/27716788 如果您还需要任何帮助,请告诉我。 :)
【解决方案2】:

自定义您的 ArrayAdapter 并在 getView 方法中设置操作

查看此页面

ListView with Add and Delete Buttons in each Row in android

【讨论】:

    【解决方案3】:

    要在活动本身的列表视图中单击图像,您必须回调

    创建接口

    public interface OnButtonClickListener {
    public void onButtonClick(int position,View view);
    
    }
    

    在你的活动类中实现 OnButtonClickListener

    你会得到一个接口方法

    @Override
    public void onButtonClick(final int position, View view) {
        int id = view.getId();
        switch (id) {
            case R.id.YOURIMAGEVIEWID:
           //implent your process...
      }
    }
    

    在适配器类中创建构造函数

     Context context;
     OnButtonClickListener callback
     public AdapterClass(Context context OnButtonClickListener buttonClickListener) {
        this.context = context;
        callback = buttonClickListener;
    }
    

    适配器类中的图像点击

    holder.imageView..setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callback.onButtonClick(position, v);
            }
        });
    

    在你的活动课上

     AdapterClass Adapter = new AdapterClass(youractivity.this, youractivity.this);
    

    为回调添加这个类

    public class ListCustomClickEvents implements OnClickListener,View.OnTouchListener {
    private int position;
    private OnCustomClickListener callback;
    
    
    // Pass in the callback (this'll be the activity) and the row position
    public ListCustomClickEvents(OnCustomClickListener callback, int pos) {
        position = pos;
        this.callback = callback;
    }
    
    @Override
    public void onClick(View v) {
        callback.OnCustomClick(v, position);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-28
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 2015-04-06
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多