[英]Change image on click in custom listview Android
In my custom listview I want to change Image when the image is clicked. 在我的自定义列表视图中,我想在单击图像时更改图像。 But currently when I click on Image, last row image is changed not the one on which I clicked.
但是目前,当我单击“图像”时,最后一行图像已更改,而不是我单击的图像。 My customAdapter classis below:
我的customAdapter类如下:
package com.zek.androidvoicechanger;
import java.util.List;
import org.w3c.dom.Text;
import android.app.Activity;
import android.content.Context;
import android.media.Image;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;
public class CustomAdapter extends ArrayAdapter<Items> {
Context context;
ImageView image ;
// int[] Radio = { R.drawable.play, R.drawable.pause };
public CustomAdapter(Context context, int resourceId, List<Items> items) {
super(context, resourceId, items);
this.context = context;
}
private class ViewHolder {
// ImageView imageView;
TextView txtTitle;
// ImageView img;
}
public View getView(final int position, View convertView,
final ViewGroup parent) {
ViewHolder holder = null;
Items rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_list, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView
.findViewById(R.id.textView1);
// holder.img = (ImageView) convertView.findViewById(R.id.imageView2);
image = (ImageView) convertView.findViewById(R.id.imageView2);
// holder.rdo = (RadioButton) convertView.findViewById(R.id.radioButton1);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtTitle.setText(rowItem.getTitle());
image.setImageResource(rowItem.getImageId());
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "image clicked", 1000).show();
if(position==0){
image.setImageResource(R.drawable.pause);
}
AudioListner.playRecord(position);
}
});
//holder.rdo.setTag(position);
// holder.rdo.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//
// @Override
// public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//
//
//
// }
// });
// rdo.setOnClickListener(new OnClickListener() {
//
// @Override
// public void onClick(View v) {
//
//
// if(position==0){
// rdo.indexOfChild(findViewById(isEnabled(position)));
// Toast.makeText(context, "image clicked", 1000).show();
// rdo.setBackgroundResource(R.drawable.pause);
// AudioListner.playRecord(position);
//
// }
//
//
//
// if (rdo.isClickable()) {
// rdo.setBackgroundResource(R.drawable.pause);
// Toast.makeText(context, "image clicked", 1000).show();
//
// //Radio[1] = 1;
// AudioListner.playRecord(position);
//
// } else {
// // rdo.setBackgroundResource(R.drawable.play);
// Toast.makeText(context, "image not clicked", 1000).show();
//
// }
////
// }
// });
return convertView;
}
}
Any help will be appreciated. 任何帮助将不胜感激。
Adapter based views like ListView
recycles its views to save resources. 基于适配器的视图(例如
ListView
回收其视图以节省资源。 During scrolls, ListView will recycle views that are no more visible. 在滚动过程中,ListView将回收不再可见的视图。 This post by Lucas is a great place to learn more about its working: http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
Lucas的帖子是了解其工作原理的好地方: http : //lucasr.org/2012/04/05/performance-tips-for-androids-listview/
So registering onClick in your getView()
method might not be a very good idea. 因此,在您的
getView()
方法中注册onClick可能不是一个好主意。 Instead use the setOnItemClickListener() method on your ListView. 而是在ListView上使用setOnItemClickListener()方法。
To accomplish what you're trying to do, you can do this: 要完成您要尝试执行的操作,可以执行以下操作:
Edit : Updated my code as per your comment. 编辑 :根据您的评论更新了我的代码。
mYourListView..setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(context, "Item #" + position + " clicked", Toast.LENGTH_SHORT).show();
// here, "position" is the position of your item and "id" is your
// item's id in your data set.
// mLastClickedPosition is a member field of type long which
// stores the position of the most recently clicked item,
// initially set to -1
if(mLastClickedPosition != -1){
// do something to pause the item in your list at this position
}
// next, update mLastClickedPosition
mLastClickedPosition = position
// find the image in your view and update it
if(position==0){
ImageView imageView = view.findViewById(R.id.your_image);
imageView.setImageResource(R.drawable.pause);
}
// play audio
AudioListner.playRecord(position);
}
});
In your posted code you have ImageView image
which belongs to your adapter, and therefore "global" to your list. 在您发布的代码中,您具有属于适配器的
ImageView image
,因此属于列表的“全局”。
Instead, what you seem to want is to have onClick
handler for each individual list item. 相反,您似乎想要的是每个单独的列表项都有
onClick
处理程序。
For this I recommend you to implement OnItemClickListener for you listView, 为此,我建议您为listView实现OnItemClickListener ,
or alternatively you could change your onClick
code to something like : 或者,您也可以将
onClick
代码更改为:
// set onClick for each img in the list
holder.img.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((ImageView) v).setImageResource(R.drawable.pause);
}
});
and don't forget to initialize holder.img
as it is currently commented out. 并且不要忘记初始化目前已注释掉的
holder.img
。
For this you have to maintain the position of clicked row. 为此,您必须保持单击行的位置。 You can do this by creating an array.
您可以通过创建一个数组来做到这一点。 Everytime you click on a row image, you can add this row's position into this array.
每次单击行图像时,都可以将该行的位置添加到此数组中。 Also use this arrray to populate your listview using if-else condition.
还可以使用if-else条件使用此方法来填充列表视图。 I have aaded that in code.
我已经在代码中添加了。
public View getView(final int position, View convertView,
final ViewGroup parent) {
ViewHolder holder = null;
Items rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.custom_list, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView
.findViewById(R.id.textView1);
// holder.img = (ImageView) convertView.findViewById(R.id.imageView2);
image = (ImageView) convertView.findViewById(R.id.imageView2);
// holder.rdo = (RadioButton) convertView.findViewById(R.id.radioButton1);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
if(yourSelectedImageArray.contains(position)){
image.setImageResource(R.drawable.pause);//your clicked image
}else{
image.setImageResource(rowItem.getImageId());//your default image
}
holder.txtTitle.setText(rowItem.getTitle());
//image.setImageResource(rowItem.getImageId());
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "image clicked", 1000).show();
if(position==0){ //not sure about this logic..
yourSelectedImageArray.add(position);//add the clicked position into an array.
image.setImageResource(R.drawable.pause);
}
AudioListner.playRecord(position);
}
});
return convertView;
}
also dont forget to remove position from this array when you click on any other row. 当您单击任何其他行时,也不要忘记从此数组中删除位置。 Hope you got my point.
希望你明白我的意思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.