从视图中获取错误的位置
Getting wrong position from view
我有一个列表视图,其中我的歌曲来自列表中的服务,每行都有按钮,即 (Play/Pause) 按钮。我在歌曲完成时遇到问题,因为如果我的歌曲结束,那么我想执行单击下一行播放按钮,但它执行单击第 4 行按钮。但是如果我增加列表行的高度而不是播放第二个。我也在尝试使用方法 setTag() 和 getTag() 但没有成功。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Planet planet = (Planet) planetList.get(position);
viewHolder = null;
// Create a new row view
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.playbutton.setTag(position_tag); //position_tag is a int variable
viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int positiont = mainListView.getPositionForView(parentRow);
String name = planet.getSong_url();
selectedPosition = positiont;
position_tag=selectedPosition;
position_tag=position_tag+1; // if i use this it gives error on complete button perform click
position_tag=1; // if i use this then it plays second song perform second button click
playsong(name);});}
mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
int hell = position_tag;
Log.d("position_on",hell+""); //aFTER 1st SONG COMPLETE these value prints "4" but i need next one
viewHolder.checkBox.findViewById(R.id.CheckBox01).findViewWithTag(position_tag).performClick();
}
});
在您的 viewHolder.playbutton.setOnClickListener 中,您可以使用查看器的 getAdapterPosition() 方法获取所点击项目的位置。在 onClickListener 中,您可以保存该位置,而在 onCompletionListener 中,只需将该位置增加 1,然后从下一行播放歌曲。
根据你的代码,你应该像下面那样做,
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Planet planet = (Planet) planetList.get(position);
viewHolder = null;
// Create a new row view
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.playbutton.setTag(position); //position_tag is a int variable
viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int positiont = Integer.parseInt(v.getTag().toString());
PlanetList planet=planetList.get(positiont)
String name = planet.getSong_url();
selectedPosition = positiont;
position_tag=positiont;
playsong(name);});}
mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
position_tag=(position_tag+1)
final Planet planet = (Planet) planetList.get(position_tag);//UPDATED
mp.setDataSource(planet.getSongUrl());
mp.start();
}
});
更新
创建名为position_tag的静态字段,然后在按钮点击时分配第一个位置,当媒体播放器完成后,您可以用position_tag添加+1,并检查位置是否仍然存在列表项。然后,将其添加到媒体播放器。将 URL 设置为 MP,然后在 mediaplayer 完成的侦听器上使用相同的引用再次启动 mediaplayer。
注意:您正在适配器 class 中创建 MediaPlayer 对象,当适配器 class 销毁并重新创建时,重新创建的 mediaplayer 对象将无法工作现有的播放媒体文件。
请将其中一行改成 getView ,应该可以解决你的问题。
final Planet planet = (Planet)this.getItem(position);
因为当您单击一个 ListView
项目时,它在可见列表项目大小中的给定位置,而不是按顺序从整个大小中单击。
也将下面的行放入您用来设置标签的 "if" 子句中。因为您每次更新标签时都会将其更改为给定所有工资新职位的视图,而不是第一次设置的实际职位膨胀列表视图的 .
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
convertView.setTag(viewHolder);
viewHolder.playbutton.setTag(position); //position is a int variable
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
我有一个列表视图,其中我的歌曲来自列表中的服务,每行都有按钮,即 (Play/Pause) 按钮。我在歌曲完成时遇到问题,因为如果我的歌曲结束,那么我想执行单击下一行播放按钮,但它执行单击第 4 行按钮。但是如果我增加列表行的高度而不是播放第二个。我也在尝试使用方法 setTag() 和 getTag() 但没有成功。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Planet planet = (Planet) planetList.get(position);
viewHolder = null;
// Create a new row view
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
}
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.playbutton.setTag(position_tag); //position_tag is a int variable
viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int positiont = mainListView.getPositionForView(parentRow);
String name = planet.getSong_url();
selectedPosition = positiont;
position_tag=selectedPosition;
position_tag=position_tag+1; // if i use this it gives error on complete button perform click
position_tag=1; // if i use this then it plays second song perform second button click
playsong(name);});}
mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
int hell = position_tag;
Log.d("position_on",hell+""); //aFTER 1st SONG COMPLETE these value prints "4" but i need next one
viewHolder.checkBox.findViewById(R.id.CheckBox01).findViewWithTag(position_tag).performClick();
}
});
在您的 viewHolder.playbutton.setOnClickListener 中,您可以使用查看器的 getAdapterPosition() 方法获取所点击项目的位置。在 onClickListener 中,您可以保存该位置,而在 onCompletionListener 中,只需将该位置增加 1,然后从下一行播放歌曲。
根据你的代码,你应该像下面那样做,
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Planet planet = (Planet) planetList.get(position);
viewHolder = null;
// Create a new row view
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.playbutton.setTag(position); //position_tag is a int variable
viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int positiont = Integer.parseInt(v.getTag().toString());
PlanetList planet=planetList.get(positiont)
String name = planet.getSong_url();
selectedPosition = positiont;
position_tag=positiont;
playsong(name);});}
mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
position_tag=(position_tag+1)
final Planet planet = (Planet) planetList.get(position_tag);//UPDATED
mp.setDataSource(planet.getSongUrl());
mp.start();
}
});
更新
创建名为position_tag的静态字段,然后在按钮点击时分配第一个位置,当媒体播放器完成后,您可以用position_tag添加+1,并检查位置是否仍然存在列表项。然后,将其添加到媒体播放器。将 URL 设置为 MP,然后在 mediaplayer 完成的侦听器上使用相同的引用再次启动 mediaplayer。
注意:您正在适配器 class 中创建 MediaPlayer 对象,当适配器 class 销毁并重新创建时,重新创建的 mediaplayer 对象将无法工作现有的播放媒体文件。
请将其中一行改成 getView ,应该可以解决你的问题。
final Planet planet = (Planet)this.getItem(position);
因为当您单击一个 ListView
项目时,它在可见列表项目大小中的给定位置,而不是按顺序从整个大小中单击。
也将下面的行放入您用来设置标签的 "if" 子句中。因为您每次更新标签时都会将其更改为给定所有工资新职位的视图,而不是第一次设置的实际职位膨胀列表视图的 .
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);
viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
convertView.setTag(viewHolder);
viewHolder.playbutton.setTag(position); //position is a int variable
} else {
viewHolder = (ViewHolder) convertView.getTag();
}