綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[教程] 請問我的程式哪裡有錯啊?

[複製連結] 查看: 1151|回覆: 4|好評: 0
跳轉到指定樓層
樓主
polor22hen | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2016-3-14 18:15

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
哪裡有錯啊還是要加啥?因為網路上找到地所以想試試看可是Listview都跑不出東西,因為要做專題需要想使用看看這個希望大大能幫我看看哪裡錯
大大幫幫忙吧很急阿

Activity

package com.example.app;

import java.io.File;  
import java.io.IOException;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.concurrent.ExecutorService;  
import java.util.concurrent.Executors;  
import android.app.Activity;  
import android.app.ProgressDialog;  
import android.media.MediaPlayer;  
import android.media.MediaPlayer.OnCompletionListener;  
import android.media.MediaPlayer.OnErrorListener;  
import android.os.Bundle;  
import android.os.Environment;  
import android.os.Handler;  
import android.os.Message;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.view.View;  
import android.view.ViewGroup;  
import android.widget.AdapterView;  
import android.widget.AdapterView.OnItemClickListener;  
import android.widget.BaseAdapter;  
import android.widget.ImageButton;  
import android.widget.ListView;  
import android.widget.SeekBar;  
import android.widget.SeekBar.OnSeekBarChangeListener;  
import android.widget.TextView;  
import android.widget.Toast;  
  
public class MediaPlayerActivity extends Activity implements OnCompletionListener,OnErrorListener,OnSeekBarChangeListener,OnItemClickListener,Runnable{  
  
    protected static final int SEARCH_MUSIC_SUCCESS = 0;// 搜索成功标记  
    private SeekBar seekBar;  
    private ListView listView;  
    private ImageButton btnPlay;  
    private TextView tv_currTime,tv_totalTime,tv_showName;  
    private List<String> list;  
    private ProgressDialog pd; // 进度条对话框  
    private MusicListAdapter ma;// 适配器  
    private MediaPlayer mp;  
    private int currIndex = 0;// 表示当前播放的音乐索引  
    private boolean flag = true;//控制进度条线程标记  
  
    // 定义当前播放器的状态״̬  
    private static final int IDLE = 0;  
    private static final int PAUSE = 1;  
    private static final int START = 2;  
    private static final int CURR_TIME_VALUE = 1;  
  
    private int currState = IDLE; // 当前播放器的状态  
    //定义线程池(同时只能有一个线程运行)  
    ExecutorService es = Executors.newSingleThreadExecutor();  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_media_player);  
        list = new ArrayList<String>();  
        mp = new MediaPlayer();  
        mp.setOnCompletionListener(this);  
        mp.setOnErrorListener(this);  
        initView();  
    }  
  
    @Override  
    protected void onDestroy() {  
        if (mp != null) {  
            mp.stop();  
            flag= false;  
            //释放资源  
            mp.release();  
        }  
        super.onDestroy();  
    }  
  
    /**  
     * 初始化UI组件  
     */  
    private void initView() {  
        btnPlay = (ImageButton) findViewById(R.id.media_play);  
        seekBar = (SeekBar) findViewById(R.id.seekBar1);  
        seekBar.setOnSeekBarChangeListener(this);  
        listView = (ListView) findViewById(R.id.listView1);  
        listView.setOnItemClickListener(this);  
        tv_currTime = (TextView) findViewById(R.id.textView1_curr_time);  
        tv_totalTime = (TextView) findViewById(R.id.textView1_total_time);  
        tv_showName = (TextView) findViewById(R.id.tv_showName);  
    }  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        //从xml文件中装载菜单  
        getMenuInflater().inflate(R.menu.media_menu, menu);  
        return super.onCreateOptionsMenu(menu);  
    }  
  
    private Handler hander = new Handler() {  
        public void handleMessage(android.os.Message msg) {  
            switch (msg.what) {  
            case SEARCH_MUSIC_SUCCESS:  
                //搜索音乐文件结束时  
                ma = new MusicListAdapter();  
                listView.setAdapter(ma);  
                pd.dismiss();  
                break;  
            case CURR_TIME_VALUE:  
                //设置当前时间  
                tv_currTime.setText(msg.obj.toString());  
                break;  
            default:  
                break;  
            }  
        };  
    };  
  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item) {  
        switch (item.getItemId()) {  
        //搜索本地音乐菜单  
        case R.id.item1_search:  
            list.clear();  
            //是否有外部存储设备  
            if (Environment.getExternalStorageState().equals(  
                    Environment.MEDIA_MOUNTED)) {  
                pd = ProgressDialog.show(this, "", "正在搜索音乐文件...", true);  
                new Thread(new Runnable() {  
                    String[] ext = { ".mp3" };  
                    File file = Environment.getExternalStorageDirectory();  
  
                    public void run() {  
                        search(file, ext);  
                        hander.sendEmptyMessage(SEARCH_MUSIC_SUCCESS);  
                    }  
                }).start();  
  
            } else {  
                Toast.makeText(this, "请插入外部存储设备..", Toast.LENGTH_LONG).show();  
            }  
  
            break;  
        //清除播放列表菜单  
        case R.id.item2_clear:  
            list.clear();  
            ma.notifyDataSetChanged();  
            break;  
        //退出菜单  
        case R.id.item3_exit:  
            flag = false;  
            this.finish();  
            break;  
        }  
        return super.onOptionsItemSelected(item);  
    }  
  
    // 搜索音乐文件  
    private void search(File file, String[] ext) {  
        if (file != null) {  
            if (file.isDirectory()) {  
                File[] listFile = file.listFiles();  
                if (listFile != null) {  
                    for (int i = 0; i < listFile.length; i++) {  
                        search(listFile[i], ext);  
                    }  
                }  
            } else {  
                String filename = file.getAbsolutePath();  
                for (int i = 0; i < ext.length; i++) {  
                    if (filename.endsWith(ext[i])) {  
                        list.add(filename);  
                        break;  
                    }  
                }  
            }  
        }  
    }  
  
    class MusicListAdapter extends BaseAdapter {  
  
        public int getCount() {  
            return list.size();  
        }  
  
        public Object getItem(int position) {  
            return list.get(position);  
        }  
  
        public long getItemId(int position) {  
            return position;  
        }  
  
        public View getView(int position, View convertView, ViewGroup parent) {  
            if (convertView == null) {  
                convertView = getLayoutInflater().inflate(R.layout.list_item,  
                        null);  
            }  
            TextView tv_music_name = (TextView) convertView  
                    .findViewById(R.id.textView1_music_name);  
            tv_music_name.setText(list.get(position));  
            return convertView;  
        }  
  
    }  
  
    private void play() {  
        switch (currState) {  
        case IDLE:  
            start();  
            break;  
        case PAUSE:  
            mp.pause();  
            btnPlay.setImageResource(R.drawable.ic_launcher);  
            currState = START;  
            break;  
        case START:  
            mp.start();  
            btnPlay.setImageResource(R.drawable.ic_launcher);  
            currState = PAUSE;  
        }  
    }  
  
    //上一首  
    private void previous() {  
        if((currIndex-1)>=0){  
            currIndex--;  
            start();  
        }else{  
            Toast.makeText(this, "当前已经是第一首歌曲了", Toast.LENGTH_SHORT).show();  
        }  
    }  
  
    //下一自首  
    private void next() {  
        if(currIndex+1<list.size()){  
            currIndex++;  
            start();  
        }else{  
            Toast.makeText(this, "当前已经是最后一首歌曲了", Toast.LENGTH_SHORT).show();  
        }  
    }  
  
    //开始播放  
    private void start() {  
        if (list.size() > 0 && currIndex < list.size()) {  
            String SongPath = list.get(currIndex);  
            mp.reset();  
            try {  
                mp.setDataSource(SongPath);  
                mp.prepare();  
                mp.start();  
                initSeekBar();  
                es.execute(this);  
                tv_showName.setText(list.get(currIndex));  
                btnPlay.setImageResource(R.drawable.ic_launcher);  
                currState = PAUSE;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }else{  
            Toast.makeText(this, "播放列表为空", Toast.LENGTH_SHORT).show();  
        }  
    }  
      
    //播放按钮  
    public void play(View v){  
        play();  
    }  
      
    //上一首按钮  
    public void previous(View v){  
        previous();  
    }  
      
    //下一首按钮  
    public void next(View v){  
        next();  
    }  
  
    //监听器,当当前歌曲播放完时触发,播放下一首  
    public void onCompletion(MediaPlayer mp) {  
        if(list.size()>0){  
            next();  
        }else{  
            Toast.makeText(this, "播放列表为空", Toast.LENGTH_SHORT).show();  
        }  
    }  
  
    //当播放异常时触发  
    public boolean onError(MediaPlayer mp, int what, int extra) {  
        mp.reset();  
        return false;  
    }  
      
    //初始化SeekBar  
    private void initSeekBar(){  
        seekBar.setMax(mp.getDuration());  
        seekBar.setProgress(0);  
        tv_totalTime.setText(toTime(mp.getDuration()));  
    }  
      
    private String toTime(int time){  
        int minute = time / 1000 / 60;  
        int s = time / 1000 % 60;  
        String mm = null;  
        String ss = null;  
        if(minute<10)mm = "0" + minute;  
        else mm = minute + "";  
         
        if(s <10)ss = "0" + s;  
        else ss = "" + s;  
         
        return mm + ":" + ss;  
    }  
  
    public void run() {  
        flag = true;  
        while(flag){  
            if(mp.getCurrentPosition()<seekBar.getMax()){  
                seekBar.setProgress(mp.getCurrentPosition());  
                Message msg = hander.obtainMessage(CURR_TIME_VALUE, toTime(mp.getCurrentPosition()));  
                hander.sendMessage(msg);  
                try {  
                    Thread.sleep(500);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
            }else{  
                flag = false;  
            }  
        }  
    }  
  
    //SeekBar监听器  
    public void onProgressChanged(SeekBar seekBar, int progress,  
            boolean fromUser) {  
        //是否由用户改变  
        if(fromUser){  
            mp.seekTo(progress);  
        }  
    }  
  
    public void onStartTrackingTouch(SeekBar seekBar) {  
    }  
  
    public void onStopTrackingTouch(SeekBar seekBar) {  
    }  
  
    //ListView监听器  
    public void onItemClick(AdapterView<?> parent, View view, int position,  
            long id) {  
        currIndex = position;  
        start();  
    }  
}


XML

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

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="324dp" >

    </ListView>

    <TextView
        android:id="@+id/tv_showName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" />

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" >

        <TextView
            android:id="@+id/textView1_curr_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp"
            android:text="00:00" />

        <SeekBar
            android:id="@+id/seekBar1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <TextView
            android:id="@+id/textView1_total_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:text="00:00" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center" >

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="previous"
            android:src="@android:drawable/ic_media_previous" />

        <ImageButton
            android:id="@+id/media_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="play"
            android:src="@android:drawable/ic_media_play" />

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="next"
            android:src="@android:drawable/ic_media_next" />
    </LinearLayout>

</LinearLayout>
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
ploglin | 收聽TA | 只看該作者
發表於 2016-3-15 09:38
你貼的程式碼太長了,一般大家不會去一行一行的看有什麼問題。
建議你,先單純試試 ListView ,有資料出來後,再去挷你要捉的檔案。
一般 ListView 的 Adpater 有 2 種,ArrayAdapter 跟 SimpleAdapter,因為你的 ListView 我看只有一個 TextView,建議你可以先試 ArrayAdapter 來試試唷。
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
whl | 收聽TA | 只看該作者
發表於 2016-3-19 06:53
Listview 沒看到哪裡有設 adapter?
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
andy08691 | 收聽TA | 只看該作者
發表於 2016-5-3 16:48
建議你可以把listview裡的layout配置在用另一個xml去寫
比較可以客製化
建議把錯誤代碼貼上來
要不然程式碼太長了
http://huli.logdown.com/posts/280137-android-custom-listview
這篇寫的蠻清楚的可以參考
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則