我正在创建一个非常简单的音箱应用程序。我正在使用包含项目(声音表示)的GridView。项目由ImageView和TextView
组成我的适配器出了问题。这是代码:
public class SoundAdapter extends ArrayAdapter<Sound>{
private Sound[] items;
private Context context = null;
public SoundAdapter(Context context, int textViewResourceId, Sound[] items) {
super(context, textViewResourceId, items);
this.items = items;
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
SoundHolder holder = null;
if (row == null) {
LayoutInflater vi = ((Activity)context).getLayoutInflater();
row = vi.inflate(R.layout.list_row, null);
holder = new SoundHolder();
holder.imgIcon = (ImageView)row.findViewById(R.id.icon);
holder.txtDescription = (TextView)row.findViewById(R.id.description);
row.setTag(holder);
//Here is the clickListener I want
}else {
holder = (SoundHolder)convertView.getTag();
}
Sound sound = items[position];
if(sound != null){
holder.txtDescription.setText(sound.getDescription());
holder.imgIcon.setImageResource(R.drawable.muscle1);
}
return row;
}
static class SoundHolder
{
ImageView imgIcon;
TextView txtDescription;
}
}
目前我的mainView中的gridView上有一个onItemClickListener,它创建了一个与被点击的项目相关联的新MediaPlayer对象。所以click事件适用于所有项目(TextView + ImageView)
我想要做的只是在getView()方法中的ImageView上的clickListener,我在其中放置了注释行:
holder.imgIcon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//create the MediaPlayer object
//start the media player
}
});
但是使用此解决方案,我无法访问clickListener中项目的位置。所以我不可能获得正确的声音。 (我需要获得声音的位置并创建MediaPlayer对象)
你对如何实现这样的目标有所了解吗?
提前谢谢。
答案 0 :(得分:1)
在clickListener中我无法访问的位置参数 方法getView()
将position
方法的getView
参数声明为final
或使用getTag/setTag
ImageView
方法获取onClick方法中的位置。
使用getTag/setTag
:
if (row == null) {
// your code here...
row.setTag(holder);
}else {
holder = (SoundHolder)convertView.getTag();
}
Sound sound = items[position];
// add click listener here
holder.imgIcon.setTag(String.valueOf(position));
并在onClick方法中从v:
获取位置@Override
public void onClick(View v) {
int pos=Integer.parseInt(v.getTag().toString());
//create the MediaPlayer object
//start the media player
}