Java 单击自定义列表视图 Android 时更改图像
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22909073/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Change image on click in custom listview Android
提问by zek
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.
任何帮助将不胜感激。
采纳答案by Saket
Adapter based views like ListView
recycles its views to save resources. During scrolls, ListView will recycle views that are no more visible. 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/
基于适配器的视图,例如ListView
回收其视图以节省资源。在滚动期间,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. Instead use the setOnItemClickListener()method on your ListView.
因此,在您的getView()
方法中注册 onClick可能不是一个好主意。而是在 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);
}
});
回答by Vikram Singh
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. I have aaded that in code.
为此,您必须保持点击行的位置。你可以通过创建一个数组来做到这一点。每次单击行图像时,都可以将此行的位置添加到此数组中。还可以使用此数组使用 if-else 条件填充您的列表视图。我已经在代码中添加了这一点。
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.
当您单击任何其他行时,也不要忘记从此数组中删除位置。希望你明白我的意思。
回答by kiruwka
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 OnItemClickListenerfor 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
因为它当前已被注释掉。