2017-04-15 135 views
1

我试着做在Android Studio中的MP3播放器,我已经加载的所有歌曲我的手机在ArrayList中称为audioList,但我不能让recyclerView,任何人都可以找到错误?Recyclerview Android不工作

MainActivity.java

import android.Manifest; 
import android.content.ComponentName; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Build; 
import android.os.IBinder; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.DefaultItemAnimator; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.Toast;  
import java.util.ArrayList; 

public class MainActivity extends AppCompatActivity { 

    private MediaPlayerService player; 
    private boolean serviceBound = false; 
    private ArrayList<Audio> audioList; 
    private RWAdapter adapt; 
    RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ 
      requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); 
     } 

     RecyclerView rv = (RecyclerView) findViewById(R.id.myRecyclerView); 
     assert rv != null; 
     rv.setLayoutManager(new LinearLayoutManager(this));; 

     loadAudio(); 
     RWAdapter rwa = new RWAdapter(audioList); 
     rv.setAdapter(rwa); 

     playAudio(audioList.get(22).getData()); 

    } 

    //ulozi sa instancia 
    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putBoolean("ServiceState", serviceBound); 
     super.onSaveInstanceState(outState); 
    } 

    //obnovi sa instancia tam kde bola naposledy ulozena 
    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     serviceBound = savedInstanceState.getBoolean("ServiceState"); 
    } 

    //znici instanciu 
    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if(serviceBound){ 
      unbindService(serviceConnection); 
      player.stopSelf(); 
     } 
    } 

    //viaze tuto triedu s prehravacom, nastavi hodnotu serviceBound na true ked sa vytvori spojenie 
    private ServiceConnection serviceConnection = new ServiceConnection(){ 
     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      MediaPlayerService.LocalBinder binder = (MediaPlayerService.LocalBinder) service; 
      player = binder.getService(); 
      serviceBound = true; 

      Toast.makeText(MainActivity.this, "Service bound", Toast.LENGTH_SHORT).show(); 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      serviceBound = false; 
     } 
    }; 

    //Metoda dava spravu,intnet druhej aktivite o spusteni hudby 
    private void playAudio(String media){ 
     if(!serviceBound){ 
      Intent playerIntent = new Intent(this,MediaPlayerService.class); 
      playerIntent.putExtra("media",media); 
      startService(playerIntent); 
      bindService(playerIntent, serviceConnection, Context.BIND_AUTO_CREATE); 

     } else {  
     } 
    } 


    //nacita pesnicky z mobilu 
    private void loadAudio() { 
     ContentResolver contentResolver = getContentResolver(); 
     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; 
     String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; 
     Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder); 

     if(cursor != null && cursor.getCount() > 0) { 
      audioList = new ArrayList<>(); 
      while (cursor.moveToNext()){ 
       String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
       String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); 
       String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
       String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
       audioList.add(new Audio(data, title, album, artist)); 
      } 
     } 
     cursor.close(); 
    }    
} 

RecyclerViewAdapter

package com.example.rsabo.mp3player; 

import android.content.Context; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.TextView;  
import java.util.Collections; 
import java.util.List; 

/** 
* Created by RSabo on 15-Apr-17. 
*/ 

public class RWAdapter extends RecyclerView.Adapter<RWAdapter.MyViewHolder>{ 
    private List<Audio> list; 
    private Context context; 

     public class MyViewHolder extends RecyclerView.ViewHolder { 

      TextView title; 
      ImageView play_pause; 

      MyViewHolder(View itemView) { 
       super(itemView); 
       title = (TextView) itemView.findViewById(R.id.title); 
       play_pause = (ImageView) itemView.findViewById(R.id.play_pause); 

       itemView.setOnClickListener(new View.OnClickListener(){ 
        @Override 
        public void onClick(View v) { 
         Audio currentAudio = list.get(getAdapterPosition());  
        } 
       }); 
      } 
     } 

    public RWAdapter(List<Audio> list) { 
     this.list = list; 
     this.context = context; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     //Inflate the layout, initialize the View Holder 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_songov, parent, false); 
     return new MyViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     //Use the provided View Holder on the onCreateViewHolder method to populate the current row on the RecyclerView 
     holder.title.setText(list.get(position).getTitle()); 
    } 

    @Override 
    public int getItemCount() { 
     //returns the number of elements the RecyclerView will display 
     return list.size(); 
    }  
} 

activity_main.xml中

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.rsabo.mp3player.MainActivity"> 

<include layout="@layout/list_songov" /> 

list_songov.xml

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

<android.support.v7.widget.RecyclerView 
    android:id="@+id/myRecyclerView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

+0

什么问题你面对?请解释 。 –

+0

的主要问题是,即时得到这些错误显示java.lang.NullPointerException:在上一个com.example.rsabo空对象引用 尝试调用虚拟方法“无效android.widget.TextView.setText(java.lang.CharSequence中)” .mp3player.RWAdapter.onBindViewHolder(RWAdapter.java:59) at com.example.rsabo.mp3player.RWAdapter.onBindViewHolder(RWAdapter.java:19) –

回答

1

入住适配器下面的代码。现在

@Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     //Inflate the layout, initialize the View Holder 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_songov, parent, false); 
     return new MyViewHolder(v); 
    } 

,里面list_songov.xml布局文件,没有TextView的,ImageView的对标题和play_pause。

请检查您是否设置里面onCreateViewHolder正确的布局()。

+1

我爱你那么多的男人:DDD –

+0

@RadoSabo呦呦的欢呼声! –

1

你是不是调用函数loadAudio(),你应该instatiating时调用此函数适配器类

+0

它正好在MainActivity中创建适配器之前 –

1

基本上你loadAudio()方法应该是的AsyncTask(后台进程)您必须等待它加载,所以使用AsyncTask并在onPostExecute方法中设置适配器请参阅示例AsyncTask Android example或此https://developer.android.com/reference/android/os/AsyncTask.html

//nacita pesnicky z mobilu 
private void loadAudio() { 
    ContentResolver contentResolver = getContentResolver(); 
    Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    String selection = MediaStore.Audio.Media.IS_MUSIC + "!= 0"; 
    String sortOrder = MediaStore.Audio.Media.TITLE + " ASC"; 
    Cursor cursor = contentResolver.query(uri, null, selection, null, sortOrder); 

    if(cursor != null && cursor.getCount() > 0) { 
     audioList = new ArrayList<>(); 
     while (cursor.moveToNext()){ 
      String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
      String title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); 
      String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
      String artist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
      audioList.add(new Audio(data, title, album, artist)); 
     } 
    } 
    cursor.close(); 
}  
+0

我试图在睡眠之后线程装载了5秒钟,它不是帮助,我觉得现在的问题是别的地方 –