Android listitem中TextView的setBackgroundResource
我有一个活动,显示歌曲曲目的列表视图。单击某个项目时,它会流式传输相应的媒体文件。我在每一行都有一个文本视图,显示曲目的长度。播放曲目时,我将行中Android listitem中TextView的setBackgroundResource,android,Android,我有一个活动,显示歌曲曲目的列表视图。单击某个项目时,它会流式传输相应的媒体文件。我在每一行都有一个文本视图,显示曲目的长度。播放曲目时,我将行中textview的backgroundresource切换到可绘制的暂停按钮。换句话说,当它准备播放时,它会显示一个播放按钮,当它当前播放时,它会显示一个暂停按钮。很简单 目前,我正在这样做,以便在播放mediaplayer时设置drawable to pause按钮: if(mp.isPlaying()){ _player.setBackground
textview
的backgroundresource
切换到可绘制的暂停按钮。换句话说,当它准备播放时,它会显示一个播放按钮,当它当前播放时,它会显示一个暂停按钮。很简单
目前,我正在这样做,以便在播放mediaplayer
时设置drawable to pause按钮:
if(mp.isPlaying()){
_player.setBackgroundResource(R.drawable.pausebtn);
_player.setText(“:”+String.valueOf(mp.getDuration()/1000));
我在Runnable中这样做,它有mediaplayer
回调onPrepared
问题是,我需要在该列表项中设置drawable,即已单击且正在播放其曲目的曲目。如何抓住已单击的曲目并将其textview设置为新的drawable
以下是完整的代码:
package com.me.player
import java.net.URL;
import java.util.ArrayList;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import android.content.Context;
import android.graphics.Color;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import com.mtv.datahandler.Artist;
import com.mtv.datahandler.DataBaseHelper;
import com.mtv.datahandler.Track;
import com.mycompany.http.HttpRequest;
public class ArtistAudio extends ControllerActivity implements OnCompletionListener, OnPreparedListener, OnErrorListener{
private int METHOD_TYPE = 0;
private static final int GET_AUDIO = 1;
int CURRENT_POSITION = 0;
int DURATION = 0;
public static final String AUDIO_FEED_URL = "http://direct.rhapsody.com/metadata/data/getTopTracksForArtist.xml?blabla";
public static final int MAX_TRACKS = 200;
ArrayList<Track> tracks = new ArrayList<Track>();
Artist artist;
private MediaPlayer mp;
private int mSongPlaying = 0;
TextView _player;
@Override
protected void progressRunnableComplete() {
if(isFinishing()){
return;
}
if(METHOD_TYPE == GET_AUDIO){
setList();
}
}
public void setList(){
ListView listview = (ListView)findViewById(R.id.ListView01);
// ListView listview = (ListView)findViewById(R.id.ListView01);
if(listview == null){
setContent(R.layout.artistaudio);
listview = (ListView)findViewById(R.id.ListView01);
}
// listview.addHeaderView();
listview.setCacheColorHint(0);
listview.setAdapter(new TrackListAdapter());
listview.setSelector(R.drawable.listbackground);
listview.setDividerHeight(1);
listview.setDivider(getResources().getDrawable(R.drawable.img_dotted_line_horz));
listview.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
TrackClicked(arg2);
}
});
}
public void TrackClicked(int arg2){
mSongPlaying = arg2;
Track track = tracks.get(arg2);
String url = track.requestInfo("previewURL");
mHandler.post(new PlaySong(url));
// mHandler.post(new PlaySong("http://dc237.4shared.com/img/315443275/33f14ef2/dlink__2Fdownload_2F9y5VGjVt_3Ftsid_3D20100705-131850-40aa0b87/preview.mp3"));
}
public void setDuration(int n) {
DURATION = n;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Audio Clips");
setContent(R.layout.artistaudio);
Object o = getIntent().getParcelableExtra("artist");
if(o!=null){
artist = (Artist)o;
}
progressRunnable(new Runnable(){
public void run(){
getTracks();
}
}, "Loading. Please Wait...",false);
}
protected void getTracks() {
METHOD_TYPE = GET_AUDIO;
if(!DataBaseHelper.isOnline(this)){
RUNNABLE_STATE = RUNNABLE_FAILED;
return;
}
HttpRequest req;
try {
req = new HttpRequest(new URL(AUDIO_FEED_URL+artist.requestInfo("rhapsodyID")));
Document doc = req.AutoXMLNoWrite();
NodeList items = doc.getElementsByTagName("e");
tracks= new ArrayList<Track>();
for(int i=0; i<items.getLength(); i++){
Track newsitem = new Track(items.item(i));
tracks.add(newsitem);
}
RUNNABLE_STATE = RUNNABLE_SUCCESS;
} catch (Throwable e) {
RUNNABLE_STATE = RUNNABLE_FAILED;
e.printStackTrace();
}
}
public void onPause(){
super.onPause();
try{mp.stop();}catch(Exception e){e.printStackTrace();}
try{mp.reset();}catch(Exception e){e.printStackTrace();}
try{mp.release();}catch(Exception e){e.printStackTrace();}
mp = null;
}
private class TrackListAdapter extends BaseAdapter{
@Override
public int getCount() {
// TODO Auto-generated method stub
return tracks.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return tracks.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
AudioCell blogView = null;
if (convertView != null) {
if(convertView.getClass() == TextView.class){
convertView = null;
}
}
if (convertView == null) {
blogView = new AudioCell(parent.getContext());
}
else {
blogView = (AudioCell) convertView;
}
blogView.display(position);
return blogView;
}
}
/** this class is responsible for rendering the data in the model, given the selection state */
class AudioCell extends RelativeLayout {
TextView _title;
int currentPosition;
public AudioCell(Context mContext) {
super(mContext);
_createUI(mContext);
}
/** create the ui components */
private void _createUI(Context m) {
RelativeLayout.LayoutParams params;
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
_player = new TextView(m);
_player.setId(2);
_player.setBackgroundResource(R.drawable.playbtn);
_player.setText(":30");
addView(_player);
params.addRule(RelativeLayout.CENTER_VERTICAL,1);
_player.setLayoutParams(params);
_title = new TextView(m);
_title.setTextColor(Color.BLACK);
params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,(int)(44*metrics.density));
params.addRule(RelativeLayout.CENTER_VERTICAL,1);
params.addRule(RelativeLayout.RIGHT_OF, _player.getId());
params.setMargins(0, 10, 0, 10);
_title.setGravity(Gravity.CENTER_VERTICAL);
_title.setLayoutParams(params);
_title.setId(102);
addView(_title);
params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,(int)(44*metrics.density));
// _player.setOnClickListener(new View.OnClickListener() {
//
// @Override
// public void onClick(View v) {
// PlaySong.PlaySong("http://http://www.noiseaddicts.com/samples/2544.mp3");
//
// }
// });
//
}
/** update the views with the data corresponding to selection index */
public void display(int index) {
_title.setText(tracks.get(index).requestInfo("name"));
}
}
private class PlaySong implements Runnable{
String songURL;
public PlaySong(String url){
songURL = url;
}
public void run(){
try{mp.stop();}catch(Exception e){e.printStackTrace();}
try{mp.reset();}catch(Exception e){e.printStackTrace();}
if(mp==null){
createPlayer();
}
try{mp.reset();}catch(Exception e){e.printStackTrace();}
try{mp.setAudioStreamType(AudioManager.STREAM_MUSIC);}catch(Exception e){e.printStackTrace();}
try{mp.setDataSource(songURL);}catch(Exception e){e.printStackTrace();}
try{mp.prepareAsync();}catch(Exception e){e.printStackTrace();}
}
}
public void createPlayer(){
mp = new MediaPlayer();
mp.setOnCompletionListener(this);
mp.setOnPreparedListener(this);
mp.setOnErrorListener(this);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
try{mp.reset();}catch(Exception e){e.printStackTrace();}
// if(mSongPlaying<tracks.size()-1)
// {
// TrackClicked(mSongPlaying+1);
// }
_player.setBackgroundResource(R.drawable.playbtn);
}
@Override
public void onPrepared(MediaPlayer inMP) {
// TODO Auto-generated method stub
mp.start();
if(mp.isPlaying()) {
_player.setBackgroundResource(R.drawable.pausebtn);
_player.setText(" :" + String.valueOf(mp.getDuration()/1000));
}
}
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
return false;
}
}
package com.me.player
导入java.net.URL;
导入java.util.ArrayList;
导入org.w3c.dom.Document;
导入org.w3c.dom.NodeList;
导入android.content.Context;
导入android.graphics.Color;
导入android.media.AudioManager;
导入android.media.MediaPlayer;
导入android.media.MediaPlayer.OnCompletionListener;
导入android.media.MediaPlayer.OnErrorListener;
导入android.media.MediaPlayer.OnPreparedListener;
导入android.os.Bundle;
导入android.util.DisplayMetrics;
导入android.view.Gravity;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.BaseAdapter;
导入android.widget.ListView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入android.widget.AdapterView.OnItemClickListener;
导入com.mtv.datahandler.Artist;
导入com.mtv.datahandler.DataBaseHelper;
导入com.mtv.datahandler.Track;
导入com.mycompany.http.HttpRequest;
公共类ArtistAudio扩展了ControllerActivity实现OnCompletionListener、OnPreparedListener和OnErrorListener{
私有int方法_TYPE=0;
专用静态最终int GET_AUDIO=1;
int当前位置=0;
int持续时间=0;
公共静态最终字符串音频\u提要\u URL=”http://direct.rhapsody.com/metadata/data/getTopTracksForArtist.xml?blabla";
公共静态最终int MAX_轨道=200;
ArrayList轨迹=新建ArrayList();
艺术家;
私人媒体播放器;
私用int-mSongPlaying=0;
文本视图(u播放器),;
@凌驾
受保护的无效进程RunnableComplete(){
if(isFinishing()){
返回;
}
if(方法类型==获取音频){
setList();
}
}
公共无效集合列表(){
ListView ListView=(ListView)findViewById(R.id.ListView01);
//ListView ListView=(ListView)findViewById(R.id.ListView01);
如果(listview==null){
设置内容(R.layout.artistaudio);
listview=(listview)findViewById(R.id.ListView01);
}
//listview.addHeaderView();
setCacheColorHint(0);
setAdapter(新的TrackListAdapter());
listview.setSelector(R.drawable.listbackground);
setDividerHeight(1);
setDivider(getResources().getDrawable(R.drawable.img_虚线_水平线));
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、,
整数arg2,长arg3){
//TODO自动生成的方法存根
(arg2);
}
});
}
已单击的公共无效跟踪(int arg2){
mSongPlaying=arg2;
Track Track=tracks.get(arg2);
字符串url=track.requestInfo(“previewURL”);
mHandler.post(新播放歌曲(url));
//mHandler.post(新播放歌曲(“http://dc237.4shared.com/img/315443275/33f14ef2/dlink__2Fdownload_2F9y5VGjVt_3Ftsid_3D20100705-131850-40aa0b87/preview.mp3"));
}
公共无效设置持续时间(整数n){
持续时间=n;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
片名(“音频剪辑”);
设置内容(R.layout.artistaudio);
对象o=getIntent().getParcelableExtra(“艺术家”);
如果(o!=null){
艺术家=(艺术家)o;
}
progressRunnable(新Runnable(){
公开募捐{
getTracks();
}
},“正在加载,请稍候…”,false);
}
受保护的void getTracks(){
方法\类型=获取\音频;
如果(!DataBaseHelper.isOnline(此)){
RUNNABLE_STATE=RUNNABLE_失败;
返回;
}
HttpRequest请求;
试一试{
req=newhttprequest(新的URL(音频提要URL+artist.requestInfo(“rhapsodyID”));
Document doc=req.AutoXMLNoWrite();
节点列表项=doc.getElementsByTagName(“e”);
tracks=newarraylist();
对于TrackClicked方法中的(int i=0;i),添加以下内容:
getAdapter().getChildAt(arg2).setBackgroundResource(R.drawable.thebackground);
更改TrackClicked
方法的signature。从onimclick
传递arg1
和arg3
,并在TrackClicked
方法中执行此操作arg1.setBackgroundResource(R.drawable.thebackground)设置整行背景资源的
。我想设置该行中某个文本视图的背景。然后尝试此操作。将arg1
转换为AudioCell
。假设要更改\u title
字段的背景,请尝试此((AudioCell)arg1)。\u title.setBackgroundResource(R.drawable.thebackground);