问题
In my android application, I am using Listview
and each row of listview will have textview and play/pause button. Here I am displaying audio file in each list row.When user click play button, audio file will start and the icon of play button will be changed to pause .If i click same button again, it will stop that audio file and icon of pause button will be to play.
The problem is that if i am accessing the play button of 1st row and i click on play button of another row, then icon of 1st row should change.I don't know how to achieve this functionality. Please help me to solve this problem.
getView() method of customAdapter :
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
RowItem_ringtone rowItem = getItem(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.ringtone_row, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView
.findViewById(R.id.ringtoneTitle);
holder.btnPlay = (ImageButton) convertView
.findViewById(R.id.btnPlay);
holder.btnSet = (ImageButton) convertView.findViewById(R.id.btnSet);
convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
holder.txtTitle.setText(rowItem.getRingTitle());
holder.btnPlay.setTag(rowItem.getRingId());
holder.btnSet.setTag(rowItem.getRingId());
holder.btnPlay.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getContext(), v.getTag().toString(),
Toast.LENGTH_LONG).show();
if (CustomListViewAdapter_ringtone.mp != null) {
if (CustomListViewAdapter_ringtone.mp.isPlaying()) {
CustomListViewAdapter_ringtone.mp.stop();
CustomListViewAdapter_ringtone.mp.release();
}
}
mp = MediaPlayer.create(getContext(),
Integer.parseInt(v.getTag().toString()));
mp.start();
v.setBackgroundResource(R.drawable.set_icon);
btnId = Integer.parseInt(v.getTag().toString());
}
});
return convertView;
}
回答1:
On List view item click listener you are changing icon right? so there you get id for row also . So you can store that id in variable as currently playing row or file. And when you click on another row just check that id and change icon according to that.
Use like this
yourlistview.setOnItemClickListener(new OnItemClickListener()
{
@Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
{
Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
This sample code works for me:
View view = null;
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
if(view != null)
{
TextView count = (TextView) view.findViewById(R.id.downloadCount);
count.setText("007");
}
view = arg1;
}
};
回答2:
Just store a reference to the last button that was clicked in your OnListItemClick method.
public class Something {
private CustomListItem previouslyClickedListItem;
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
CustomListItem item = (CustomListItem) view;
if (item != previouslyClickedListItem) {
// Set previouslyClickedListItem to not clicked
prevouslyClickedListItem = item;
// Set item to clicked
} else {
// Set prevouslyClickListItem to not clicked
}
}
}
回答3:
You must be using the custom adapter of listview and your code must be inside the getView method.
In this method, after the findviewbyid, just assign tags to the buttons.
eg, btn.setTag(position);
and then when you click the play button, just get that tag. e.g, int clickedposition = (Intger)btn.getTag();
You will now be able to change the icon of that particular row only.
回答4:
Below is The Code Snippet for your salvation. I used toggle button for e.g. you can change accordingly
public class CustomListviewAdapter extends BaseAdapter {
private View PreviousView=null;
public View getView(final int position, View convertView, final ViewGroup parent) {
togglebutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View CurrentView = v;
if(PreviousView != null && PreviousView != CurrentView){
ToggleButton tb=(ToggleButton)PreviousView.findViewById(R.id.togglebutton);
tb.setChecked(false);
}
PreviousView=CurrentView;
}
});
}
}
来源:https://stackoverflow.com/questions/18076350/using-buttons-in-listview-row-android