在我的自定义列表视图中,我想在单击图像时更改图像。 但是目前当我点击图像时,最后一行图像不是我点击的图像。 我的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;
}
}
任何帮助将不胜感激。
答案 0 :(得分:4)
基于适配器的视图(如ListView
)会回收其视图以节省资源。在滚动期间,ListView将回收不再可见的视图。卢卡斯的这篇文章是了解更多有关其工作的好地方:http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
因此,在getView()
方法中注册onClick可能不是一个好主意。而是在ListView上使用setOnItemClickListener()方法。
要完成您要做的事情,您可以这样做:
修改:根据您的评论更新了我的代码。
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);
}
});
答案 1 :(得分:1)
在您发布的代码中,您有ImageView image
属于您的适配器,因此属于您的列表的“全局”。
相反,您似乎想要的是为每个列表项设置onClick
处理程序。
为此,我建议您为listView实施OnItemClickListener,
或者您也可以将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);
}
});
并且不要忘记初始化holder.img
,因为它目前已被注释掉。
答案 2 :(得分:-1)
为此,您必须保持点击行的位置。您可以通过创建数组来完成此操作。每次单击行图像时,都可以将此行的位置添加到此数组中。也可以使用此arrray使用if-else条件填充listview。我在代码中已经厌倦了。
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;
}
也不要忘记在单击任何其他行时从此数组中删除位置。希望你明白我的意思。