在 activity 内的 Imageview(Listview) 上设置 onClickListener
set onClickListener on Imageview(Listview) inside activity
有没有办法在 activity 内的 Imageview(Listview) 上设置 onClickListener?
我已经创建了它,它在我的适配器中工作得很好,但它在我的 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();
}
});
}
这是我的产品 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;
}
}
适配器Class(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;
}
自定义 ArrayAdapter 并在方法 getView 中设置操作
查看此页面
ListView with Add and Delete Buttons in each Row in android
您可以通过两种方式完成:
做一个像这样的界面
public interface ImageClick {
public imageButtonOnClick(View view, int position)
}
在你的activity和你的适配器getView
中实现它,设置imageOnClickListener
,并在onClick
中调用这个接口方法,传递你的位置和视图在其中,因此您可以在 activity 回调中使用位置等。
其次是在您的 activity 中创建一个方法,就像在接口
中一样
public imageButtonOnClick(View view, int position)
在 imageView 的适配器 onClick 方法中,将其命名为类似
((YourActivity)context).imageButtonOnClick(params1, param2);
要在 activity 本身的列表视图中单击图像,您必须回调
创建接口
public interface OnButtonClickListener {
public void onButtonClick(int position,View view);
}
在您的活动中 class 实施 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;
}
在适配器中点击图像 class
holder.imageView..setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callback.onButtonClick(position, v);
}
});
在你的活动中class
AdapterClass Adapter = new AdapterClass(youractivity.this, youractivity.this);
添加此 class 用于回调
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);
}
}
有没有办法在 activity 内的 Imageview(Listview) 上设置 onClickListener? 我已经创建了它,它在我的适配器中工作得很好,但它在我的 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();
}
});
}
这是我的产品 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;
}
}
适配器Class(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;
}
自定义 ArrayAdapter 并在方法 getView 中设置操作
查看此页面
ListView with Add and Delete Buttons in each Row in android
您可以通过两种方式完成: 做一个像这样的界面
public interface ImageClick {
public imageButtonOnClick(View view, int position)
}
在你的activity和你的适配器getView
中实现它,设置imageOnClickListener
,并在onClick
中调用这个接口方法,传递你的位置和视图在其中,因此您可以在 activity 回调中使用位置等。
其次是在您的 activity 中创建一个方法,就像在接口
中一样public imageButtonOnClick(View view, int position)
在 imageView 的适配器 onClick 方法中,将其命名为类似
((YourActivity)context).imageButtonOnClick(params1, param2);
要在 activity 本身的列表视图中单击图像,您必须回调
创建接口
public interface OnButtonClickListener {
public void onButtonClick(int position,View view);
}
在您的活动中 class 实施 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;
}
在适配器中点击图像 class
holder.imageView..setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
callback.onButtonClick(position, v);
}
});
在你的活动中class
AdapterClass Adapter = new AdapterClass(youractivity.this, youractivity.this);
添加此 class 用于回调
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);
}
}