2012-03-20 16 views
1

私は音楽プレーヤーアプリを開発しています。ここでは、sdcardで利用可能なすべての音楽ファイルを取得し、リストに表示します。 リスト内には、曲を再生するための再生ボタンがあります。 最初は、すべての画像が「PLAY BUTTON」状態になります。 enter image description hereボタンのイメージをリスト内でクリックすると変更しますアンドロイドで表示

ユーザーが再生ボタンをクリックすると、再生ボタンがこれに変わります。

enter image description here

や音楽を再生/一時停止に応じます。

しかし、私が直面している問題は、最初の曲を再生すると曲が再生され、アイコンが変わります。リストを下にスクロールすると、「PAUSE」ボタンの画像がランダムに表示されますリスト。以下は

コードです: (そのまだdevelopemntの下で、それは音楽を演奏することになると、私は、この画像の問題を解決するために定義さ)

MusicActivity:

package sample.music; 

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MusicActivity extends Activity { 
    ListView musiclist; 
    Cursor musiccursor; 
    int music_column_index; 
    int count; 
    MediaPlayer mMediaPlayer; 

    private static LayoutInflater inflater = null; 

    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     mMediaPlayer.release(); 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     init_phone_music_grid(); 

    } 

    private void init_phone_music_grid() { 
     System.gc(); 
     String[] proj = { MediaStore.Audio.Media._ID, 
       MediaStore.Audio.Media.DATA, 
       MediaStore.Audio.Media.DISPLAY_NAME, 
       MediaStore.Video.Media.SIZE }; 
     musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
       proj, null, null, null); 
     count = musiccursor.getCount(); 
     musiclist = (ListView) findViewById(R.id.PhoneMusicList); 
     musiclist.setAdapter(new MusicAdapter(getApplicationContext())); 
     musiclist.setDividerHeight(50); 

     // musiclist.setOnItemClickListener(musicgridlistener); 
     mMediaPlayer = new MediaPlayer(); 
    } 

    static class ViewHolder { 

     TextView textView; 
     ImageView imageView; 
    } 

    public class MusicAdapter extends BaseAdapter { 
     private Context mContext; 

     public MusicAdapter(Context c) { 
      mContext = c; 
     } 

     public int getCount() { 
      return count; 
     } 

     public Object getItem(int position) { 
      return position; 
     } 

     public long getItemId(int position) { 
      return position; 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      System.gc(); 
      String id = null; 
      View vi = convertView; 
      final int muscPosition = position; 

      final ViewHolder viewHolder; 
      if (convertView == null) { 
       inflater = MusicActivity.this.getLayoutInflater(); 
       vi = inflater.inflate(R.layout.item, null); 
      } 
       viewHolder = new ViewHolder(); 
       viewHolder.textView = (TextView) vi.findViewById(R.id.text); 

       viewHolder.imageView = (ImageView) vi.findViewById(R.id.image); 

       //final ImageView tempView = viewHolder.imageView; 
       viewHolder.imageView.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         // TODO Auto-generated method stub 
         music_column_index = musiccursor 
           .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
         musiccursor.moveToPosition(muscPosition); 
         String filename = musiccursor 
           .getString(music_column_index); 

         try { 
          if (mMediaPlayer.isPlaying()) { 
           Toast.makeText(MusicActivity.this, 
             "mMediaPlayer.isPlaying()", 
             Toast.LENGTH_LONG).show(); 
           try { 
            mMediaPlayer.stop(); 
            mMediaPlayer.release(); 
            viewHolder.imageView.setImageResource(R.drawable.play_button); 
            //notifyDataSetChanged(); 
           } catch (Exception e) { 
            // TODO: handle exception 
            Toast.makeText(MusicActivity.this, e + "", 
              Toast.LENGTH_LONG).show(); 
           } 

          } else { 
           Toast.makeText(MusicActivity.this, 
             "mMediaPlayer.start", Toast.LENGTH_LONG) 
             .show(); 
           viewHolder.imageView.setImageResource(R.drawable.pause_button); 

           //notifyDataSetChanged(); 
           mMediaPlayer.setDataSource(filename); 
           mMediaPlayer.prepare(); 
           mMediaPlayer.start(); 
          } 
         } catch (Exception e) { 
          Toast.makeText(MusicActivity.this, e + ""+".....", 
            Toast.LENGTH_LONG).show(); 
         } 
        } 
       }); 

       music_column_index = musiccursor 
         .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
       musiccursor.moveToPosition(position); 
       id = musiccursor.getString(music_column_index); 
       music_column_index = musiccursor 
         .getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
       musiccursor.moveToPosition(position); 
       id += " Size(KB):" + musiccursor.getString(music_column_index); 

       vi.setTag(viewHolder); 
       viewHolder.textView.setText(id); 

      return vi; 
     } 
    } 
} 

main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <ListView 
     android:id="@+id/PhoneMusicList" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ImageView 
     android:id="@+id/image" 
     android:layout_width="50dip" 
     android:layout_height="50dip" android:src="@drawable/play_button" android:scaleType="centerCrop"/> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" android:layout_gravity="left|center_vertical" android:textSize="20dip" android:layout_marginLeft="10dip"/> 
</LinearLayout> 
+0

CursorAdapterはカーソルインデックスまたはListView位置に '再生'アイコンを描画していますか? (前者は正しいでしょう)それが私がチェックする最初のことです。 – Sparky

+0

もしあなたがこれをしたらplzは私にこの長い時間pls reply –

答えて

0

あなたが直面している問題は、再生中のビューに一時停止画像が含まれていることです。明示的にチェックする必要があります。

int pause_button_position=-1; //add 
    public View getView(int position, View convertView, ViewGroup parent) { 
       System.gc(); 
       String id = null; 
       View vi = convertView; 
       final int muscPosition = position; 

       final ViewHolder viewHolder; 
       if (convertView == null) { 
        inflater = MusicActivity.this.getLayoutInflater(); 
        vi = inflater.inflate(R.layout.item, null); 
       } 
        viewHolder = new ViewHolder(); 
        viewHolder.textView = (TextView) vi.findViewById(R.id.text); 

        viewHolder.imageView = (ImageView) vi.findViewById(R.id.image); 

if(position!=pause_button_position)      
viewHolder.imageView.setImageResource(R.drawable.play_button); //add this line 

        //final ImageView tempView = viewHolder.imageView; 
        viewHolder.imageView.setOnClickListener(new OnClickListener() { 

         @Override 
         public void onClick(View v) { 
          // TODO Auto-generated method stub 
          music_column_index = musiccursor 
            .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA); 
          musiccursor.moveToPosition(muscPosition); 
          String filename = musiccursor 
            .getString(music_column_index); 

          try { 
           if (mMediaPlayer.isPlaying()) { 
            Toast.makeText(MusicActivity.this, 
              "mMediaPlayer.isPlaying()", 
              Toast.LENGTH_LONG).show(); 
            try { 
             mMediaPlayer.stop(); 
             mMediaPlayer.release(); 
             viewHolder.imageView.setImageResource(R.drawable.play_button); 
             //notifyDataSetChanged(); 
            } catch (Exception e) { 
             // TODO: handle exception 
             Toast.makeText(MusicActivity.this, e + "", 
               Toast.LENGTH_LONG).show(); 
            } 

           } else { 
            Toast.makeText(MusicActivity.this, 
              "mMediaPlayer.start", Toast.LENGTH_LONG) 
              .show(); 
            viewHolder.imageView.setImageResource(R.drawable.pause_button); 
    pause_button_position=position; //add 
            //notifyDataSetChanged(); 
            mMediaPlayer.setDataSource(filename); 
            mMediaPlayer.prepare(); 
            mMediaPlayer.start(); 
           } 
          } catch (Exception e) { 
           Toast.makeText(MusicActivity.this, e + ""+".....", 
             Toast.LENGTH_LONG).show(); 
          } 
         } 
        }); 

        music_column_index = musiccursor 
          .getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME); 
        musiccursor.moveToPosition(position); 
        id = musiccursor.getString(music_column_index); 
        music_column_index = musiccursor 
          .getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE); 
        musiccursor.moveToPosition(position); 
        id += " Size(KB):" + musiccursor.getString(music_column_index); 

        vi.setTag(viewHolder); 
        viewHolder.textView.setText(id); 

       return vi; 
      } 
3

これはよくある問題です。すべてを一度に描画するスクロールビューとは異なり、ListViewでは実行時に描画されます。だから私はアダプタの各リスト項目のボタンの状態を格納するコレクションを維持することをお勧めします。

ビューの取得機能では、ボタンのドローブを変更します。

ボタンをクリックすると、アダプタ内のコレクション内のボタンの状態を変更します。

私はあなたの質問にお答えしたいと思います。

関連する問題