0

Is there a way to set onClickListener on Imageview(Listview) inside activity ? I'v created this , and it works just fine in my adapter, But it's not working in my activity :

    @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();
            }

        });

    }

And this is my Product class :

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

  }

Adapter Class (Fundapter library) :

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;
}
DastakWall
  • 377
  • 1
  • 7
  • 25

3 Answers3

0

Custom your ArrayAdapter and set action in method getView

See this page

ListView with Add and Delete Buttons in each Row in android

Community
  • 1
  • 1
0

you can do it with two ways: Make an interface something like this

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

implement it in your activity, and in your adapter getView, set imageOnClickListener, and call this interface method inside that onClick, pass your position and view in it, so you can use position etc in your activity callback.

Second is to just make a method in your activity like in interface

public imageButtonOnClick(View view, int position)

in your adapter onClick method on imageView, call it something like

((YourActivity)context).imageButtonOnClick(params1, param2);
Junaid Hafeez
  • 1,618
  • 1
  • 16
  • 25
  • It seems your solution will work ,as I am new in android can you kindly explain more your way "one" with an example !?, i will accept your answer – DastakWall Feb 14 '17 at 13:19
  • before i edit and put details, i have found a good example exactly what I am saying. see this http://stackoverflow.com/a/27716788 let me know if you still need any help. :) – Junaid Hafeez Feb 14 '17 at 13:31
0

For getting click the image in the list view in the activity itself you have to callback

Create an interface

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

}

in your actvity class implement OnButtonClickListener

you get a interface methood

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

Create constructor in adapter calss

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

image click in adapter class

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

in your actvity class

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

Add this class for callback

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);
}
}
Sasi
  • 445
  • 4
  • 19