Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在具有片段的活动中为listview设置适配器时发生Nullpointerexception_Android_Listview_Android Fragments_Adapter - Fatal编程技术网

Android 在具有片段的活动中为listview设置适配器时发生Nullpointerexception

Android 在具有片段的活动中为listview设置适配器时发生Nullpointerexception,android,listview,android-fragments,adapter,Android,Listview,Android Fragments,Adapter,我正在开发一个非常小的音频播放器,但有时我会遇到一些让我发疯的错误。现在,当我为ListView(外部存储上的音频文件列表)设置适配器时,我面临一个NullPointerException。 我只使用了一个带有actionbar和两个选项卡的活动(两个片段可以通过swype切换)。我还没有为玩家实现控件,我还在开发列表 MainActivity.java import java.util.ArrayList; import java.util.Collections; import java.u

我正在开发一个非常小的音频播放器,但有时我会遇到一些让我发疯的错误。现在,当我为ListView(外部存储上的音频文件列表)设置适配器时,我面临一个NullPointerException。 我只使用了一个带有actionbar和两个选项卡的活动(两个片段可以通过swype切换)。我还没有为玩家实现控件,我还在开发列表

MainActivity.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

import android.app.ActionBar.Tab;
import android.app.ActionBar;
import android.database.Cursor;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    private MyAdapter mAdapter;
    private ViewPager mPager;

    private ArrayList<Song> songsList;
    private ListView songsView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tabs();
    }

    private void tabs() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }

    public class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return FilesFragment.newInstance(0);
            case 1:
                return ControlsFragment.newInstance(1);

            default:
                return null;
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            }
            return null;
        }
    }

    @Override
    protected void onStart(){
        retrieveAudioFiles();

        songsOrder();

        inflateWithSongs();
    }

    public void retrieveAudioFiles(){
        songsView = (ListView)findViewById(R.id.list);
        songsList = new ArrayList<Song>();

        Uri sd = Audio.Media.EXTERNAL_CONTENT_URI;
        String[] cols = {Audio.Media.TITLE,Audio.Media.ARTIST,Audio.Media.ALBUM};
        String where = Audio.Media.IS_MUSIC;
        Cursor audioCursor = getContentResolver().query(sd,cols,where,null,null);

        while (audioCursor.moveToNext()){
            int posColTitle = audioCursor.getColumnIndex(Audio.Media.TITLE);
            int posColArtist = audioCursor.getColumnIndex(Audio.Media.ARTIST);
            int posColAlbum = audioCursor.getColumnIndex(Audio.Media.ALBUM);

            String songTitle = audioCursor.getString(posColTitle);
            String songArtist = audioCursor.getString(posColArtist);
            String songAlbum = audioCursor.getString(posColAlbum);

            songsList.add(new Song(songTitle,songArtist,songAlbum));
            }
        audioCursor.close();
    }

    public void songsOrder(){
        Collections.sort(songsList, new Comparator<Song>(){
              public int compare(Song a, Song b){
                return a.title.compareTo(b.title);
              }
            });
    }

    public void inflateWithSongs(){
        SongsAdapter songsAdt = new SongsAdapter(this, songsList);
        songsView = (ListView) findViewById(R.id.list);
        songsView.setAdapter(songsAdt); //ERROR HERE!!! SONGSVIEW IS NULL
    }

    public void songPicked(){
        //work in progress
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_files, container,
                    false);
            return rootView;
        }
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FilesFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static FilesFragment newInstance(int index) {
        FilesFragment f = new FilesFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_files, container, false);
        return view;
    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ControlsFragment extends Fragment {

    public static ControlsFragment newInstance(int index) {
        ControlsFragment f = new ControlsFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_controls, container, false);
        return view;
    }
}
import android.graphics.Bitmap;
import android.net.Uri;

public class Song {

    public String title="";
    public String artist="";
    public String album="";
    private Uri path=null;
    private Bitmap cover=null;

    public Song(String t, String ar, String al){
        title=t;
        artist=ar;
        album=al;
    }

    public Song(String t, String ar, String al, Uri p){
        title=t;
        artist=ar;
        album=al;
        path=p;
    }

    public Song(String t, Uri p){
        title=t;
        path=p;
    }

    public Song(){

    }

}
import java.util.ArrayList;

public class SongsList extends ArrayList<Song> {

    public SongsList(){
        super();
    }

}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SongsAdapter extends BaseAdapter {

    private ArrayList<Song> songs;
    private LayoutInflater songInf;

    public SongsAdapter(Context c, ArrayList<Song> theSongs){
        super();  
        songs=theSongs;
        songInf=LayoutInflater.from(c);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return songs.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
        RowWrapper wrapper;
        if (convertView == null)
        {
            convertView = songInf.inflate(
                R.layout.song_row, null);
            wrapper = new RowWrapper(convertView);
            convertView.setTag(wrapper);
        }
        else
        {
            wrapper = (RowWrapper) convertView.getTag();
        }
        Song song = (Song) getItem(position);
        wrapper.populate(song);

        return convertView;
    }

    private static class RowWrapper
    {
        private TextView titleTextView;
        private TextView artistTextView;
        private TextView albumTextView;

        public RowWrapper(View convertView)
        {
            titleTextView = (TextView) 
                convertView.findViewById(R.id.textTitle);
            artistTextView = (TextView) 
                convertView.findViewById(R.id.textArtist);
            albumTextView = (TextView) 
                convertView.findViewById(R.id.textAlbum);
        }

        public void populate(Song song)
        {
            titleTextView.setText(song.title);
            artistTextView.setText(song.artist);
            albumTextView.setText(song.album);
        }
    }

}
ControlsFragment.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

import android.app.ActionBar.Tab;
import android.app.ActionBar;
import android.database.Cursor;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    private MyAdapter mAdapter;
    private ViewPager mPager;

    private ArrayList<Song> songsList;
    private ListView songsView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tabs();
    }

    private void tabs() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }

    public class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return FilesFragment.newInstance(0);
            case 1:
                return ControlsFragment.newInstance(1);

            default:
                return null;
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            }
            return null;
        }
    }

    @Override
    protected void onStart(){
        retrieveAudioFiles();

        songsOrder();

        inflateWithSongs();
    }

    public void retrieveAudioFiles(){
        songsView = (ListView)findViewById(R.id.list);
        songsList = new ArrayList<Song>();

        Uri sd = Audio.Media.EXTERNAL_CONTENT_URI;
        String[] cols = {Audio.Media.TITLE,Audio.Media.ARTIST,Audio.Media.ALBUM};
        String where = Audio.Media.IS_MUSIC;
        Cursor audioCursor = getContentResolver().query(sd,cols,where,null,null);

        while (audioCursor.moveToNext()){
            int posColTitle = audioCursor.getColumnIndex(Audio.Media.TITLE);
            int posColArtist = audioCursor.getColumnIndex(Audio.Media.ARTIST);
            int posColAlbum = audioCursor.getColumnIndex(Audio.Media.ALBUM);

            String songTitle = audioCursor.getString(posColTitle);
            String songArtist = audioCursor.getString(posColArtist);
            String songAlbum = audioCursor.getString(posColAlbum);

            songsList.add(new Song(songTitle,songArtist,songAlbum));
            }
        audioCursor.close();
    }

    public void songsOrder(){
        Collections.sort(songsList, new Comparator<Song>(){
              public int compare(Song a, Song b){
                return a.title.compareTo(b.title);
              }
            });
    }

    public void inflateWithSongs(){
        SongsAdapter songsAdt = new SongsAdapter(this, songsList);
        songsView = (ListView) findViewById(R.id.list);
        songsView.setAdapter(songsAdt); //ERROR HERE!!! SONGSVIEW IS NULL
    }

    public void songPicked(){
        //work in progress
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_files, container,
                    false);
            return rootView;
        }
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FilesFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static FilesFragment newInstance(int index) {
        FilesFragment f = new FilesFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_files, container, false);
        return view;
    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ControlsFragment extends Fragment {

    public static ControlsFragment newInstance(int index) {
        ControlsFragment f = new ControlsFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_controls, container, false);
        return view;
    }
}
import android.graphics.Bitmap;
import android.net.Uri;

public class Song {

    public String title="";
    public String artist="";
    public String album="";
    private Uri path=null;
    private Bitmap cover=null;

    public Song(String t, String ar, String al){
        title=t;
        artist=ar;
        album=al;
    }

    public Song(String t, String ar, String al, Uri p){
        title=t;
        artist=ar;
        album=al;
        path=p;
    }

    public Song(String t, Uri p){
        title=t;
        path=p;
    }

    public Song(){

    }

}
import java.util.ArrayList;

public class SongsList extends ArrayList<Song> {

    public SongsList(){
        super();
    }

}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SongsAdapter extends BaseAdapter {

    private ArrayList<Song> songs;
    private LayoutInflater songInf;

    public SongsAdapter(Context c, ArrayList<Song> theSongs){
        super();  
        songs=theSongs;
        songInf=LayoutInflater.from(c);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return songs.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
        RowWrapper wrapper;
        if (convertView == null)
        {
            convertView = songInf.inflate(
                R.layout.song_row, null);
            wrapper = new RowWrapper(convertView);
            convertView.setTag(wrapper);
        }
        else
        {
            wrapper = (RowWrapper) convertView.getTag();
        }
        Song song = (Song) getItem(position);
        wrapper.populate(song);

        return convertView;
    }

    private static class RowWrapper
    {
        private TextView titleTextView;
        private TextView artistTextView;
        private TextView albumTextView;

        public RowWrapper(View convertView)
        {
            titleTextView = (TextView) 
                convertView.findViewById(R.id.textTitle);
            artistTextView = (TextView) 
                convertView.findViewById(R.id.textArtist);
            albumTextView = (TextView) 
                convertView.findViewById(R.id.textAlbum);
        }

        public void populate(Song song)
        {
            titleTextView.setText(song.title);
            artistTextView.setText(song.artist);
            albumTextView.setText(song.album);
        }
    }

}
Song.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

import android.app.ActionBar.Tab;
import android.app.ActionBar;
import android.database.Cursor;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    private MyAdapter mAdapter;
    private ViewPager mPager;

    private ArrayList<Song> songsList;
    private ListView songsView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tabs();
    }

    private void tabs() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }

    public class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return FilesFragment.newInstance(0);
            case 1:
                return ControlsFragment.newInstance(1);

            default:
                return null;
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            }
            return null;
        }
    }

    @Override
    protected void onStart(){
        retrieveAudioFiles();

        songsOrder();

        inflateWithSongs();
    }

    public void retrieveAudioFiles(){
        songsView = (ListView)findViewById(R.id.list);
        songsList = new ArrayList<Song>();

        Uri sd = Audio.Media.EXTERNAL_CONTENT_URI;
        String[] cols = {Audio.Media.TITLE,Audio.Media.ARTIST,Audio.Media.ALBUM};
        String where = Audio.Media.IS_MUSIC;
        Cursor audioCursor = getContentResolver().query(sd,cols,where,null,null);

        while (audioCursor.moveToNext()){
            int posColTitle = audioCursor.getColumnIndex(Audio.Media.TITLE);
            int posColArtist = audioCursor.getColumnIndex(Audio.Media.ARTIST);
            int posColAlbum = audioCursor.getColumnIndex(Audio.Media.ALBUM);

            String songTitle = audioCursor.getString(posColTitle);
            String songArtist = audioCursor.getString(posColArtist);
            String songAlbum = audioCursor.getString(posColAlbum);

            songsList.add(new Song(songTitle,songArtist,songAlbum));
            }
        audioCursor.close();
    }

    public void songsOrder(){
        Collections.sort(songsList, new Comparator<Song>(){
              public int compare(Song a, Song b){
                return a.title.compareTo(b.title);
              }
            });
    }

    public void inflateWithSongs(){
        SongsAdapter songsAdt = new SongsAdapter(this, songsList);
        songsView = (ListView) findViewById(R.id.list);
        songsView.setAdapter(songsAdt); //ERROR HERE!!! SONGSVIEW IS NULL
    }

    public void songPicked(){
        //work in progress
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_files, container,
                    false);
            return rootView;
        }
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FilesFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static FilesFragment newInstance(int index) {
        FilesFragment f = new FilesFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_files, container, false);
        return view;
    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ControlsFragment extends Fragment {

    public static ControlsFragment newInstance(int index) {
        ControlsFragment f = new ControlsFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_controls, container, false);
        return view;
    }
}
import android.graphics.Bitmap;
import android.net.Uri;

public class Song {

    public String title="";
    public String artist="";
    public String album="";
    private Uri path=null;
    private Bitmap cover=null;

    public Song(String t, String ar, String al){
        title=t;
        artist=ar;
        album=al;
    }

    public Song(String t, String ar, String al, Uri p){
        title=t;
        artist=ar;
        album=al;
        path=p;
    }

    public Song(String t, Uri p){
        title=t;
        path=p;
    }

    public Song(){

    }

}
import java.util.ArrayList;

public class SongsList extends ArrayList<Song> {

    public SongsList(){
        super();
    }

}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SongsAdapter extends BaseAdapter {

    private ArrayList<Song> songs;
    private LayoutInflater songInf;

    public SongsAdapter(Context c, ArrayList<Song> theSongs){
        super();  
        songs=theSongs;
        songInf=LayoutInflater.from(c);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return songs.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
        RowWrapper wrapper;
        if (convertView == null)
        {
            convertView = songInf.inflate(
                R.layout.song_row, null);
            wrapper = new RowWrapper(convertView);
            convertView.setTag(wrapper);
        }
        else
        {
            wrapper = (RowWrapper) convertView.getTag();
        }
        Song song = (Song) getItem(position);
        wrapper.populate(song);

        return convertView;
    }

    private static class RowWrapper
    {
        private TextView titleTextView;
        private TextView artistTextView;
        private TextView albumTextView;

        public RowWrapper(View convertView)
        {
            titleTextView = (TextView) 
                convertView.findViewById(R.id.textTitle);
            artistTextView = (TextView) 
                convertView.findViewById(R.id.textArtist);
            albumTextView = (TextView) 
                convertView.findViewById(R.id.textAlbum);
        }

        public void populate(Song song)
        {
            titleTextView.setText(song.title);
            artistTextView.setText(song.artist);
            albumTextView.setText(song.album);
        }
    }

}
SongsList.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;

import android.app.ActionBar.Tab;
import android.app.ActionBar;
import android.database.Cursor;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

public class MainActivity extends FragmentActivity implements ActionBar.TabListener {

    private MyAdapter mAdapter;
    private ViewPager mPager;

    private ArrayList<Song> songsList;
    private ListView songsView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tabs();
    }

    private void tabs() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager) findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                    @Override
                    public void onPageSelected(int position) {
                        actionBar.setSelectedNavigationItem(position);
                    }
                });

        for (int i = 0; i < mAdapter.getCount(); i++) {
            actionBar.addTab(actionBar.newTab()
                    .setText(mAdapter.getPageTitle(i))
                    .setTabListener(this));
        }
    }

    public class MyAdapter extends FragmentPagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return 2;
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
            case 0:
                return FilesFragment.newInstance(0);
            case 1:
                return ControlsFragment.newInstance(1);

            default:
                return null;
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            }
            return null;
        }
    }

    @Override
    protected void onStart(){
        retrieveAudioFiles();

        songsOrder();

        inflateWithSongs();
    }

    public void retrieveAudioFiles(){
        songsView = (ListView)findViewById(R.id.list);
        songsList = new ArrayList<Song>();

        Uri sd = Audio.Media.EXTERNAL_CONTENT_URI;
        String[] cols = {Audio.Media.TITLE,Audio.Media.ARTIST,Audio.Media.ALBUM};
        String where = Audio.Media.IS_MUSIC;
        Cursor audioCursor = getContentResolver().query(sd,cols,where,null,null);

        while (audioCursor.moveToNext()){
            int posColTitle = audioCursor.getColumnIndex(Audio.Media.TITLE);
            int posColArtist = audioCursor.getColumnIndex(Audio.Media.ARTIST);
            int posColAlbum = audioCursor.getColumnIndex(Audio.Media.ALBUM);

            String songTitle = audioCursor.getString(posColTitle);
            String songArtist = audioCursor.getString(posColArtist);
            String songAlbum = audioCursor.getString(posColAlbum);

            songsList.add(new Song(songTitle,songArtist,songAlbum));
            }
        audioCursor.close();
    }

    public void songsOrder(){
        Collections.sort(songsList, new Comparator<Song>(){
              public int compare(Song a, Song b){
                return a.title.compareTo(b.title);
              }
            });
    }

    public void inflateWithSongs(){
        SongsAdapter songsAdt = new SongsAdapter(this, songsList);
        songsView = (ListView) findViewById(R.id.list);
        songsView.setAdapter(songsAdt); //ERROR HERE!!! SONGSVIEW IS NULL
    }

    public void songPicked(){
        //work in progress
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_files, container,
                    false);
            return rootView;
        }
    }

    @Override
    public void onTabSelected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onTabReselected(Tab tab, android.app.FragmentTransaction ft) {
        // TODO Auto-generated method stub

    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FilesFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public static FilesFragment newInstance(int index) {
        FilesFragment f = new FilesFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_files, container, false);
        return view;
    }
}
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ControlsFragment extends Fragment {

    public static ControlsFragment newInstance(int index) {
        ControlsFragment f = new ControlsFragment();
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_controls, container, false);
        return view;
    }
}
import android.graphics.Bitmap;
import android.net.Uri;

public class Song {

    public String title="";
    public String artist="";
    public String album="";
    private Uri path=null;
    private Bitmap cover=null;

    public Song(String t, String ar, String al){
        title=t;
        artist=ar;
        album=al;
    }

    public Song(String t, String ar, String al, Uri p){
        title=t;
        artist=ar;
        album=al;
        path=p;
    }

    public Song(String t, Uri p){
        title=t;
        path=p;
    }

    public Song(){

    }

}
import java.util.ArrayList;

public class SongsList extends ArrayList<Song> {

    public SongsList(){
        super();
    }

}
import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class SongsAdapter extends BaseAdapter {

    private ArrayList<Song> songs;
    private LayoutInflater songInf;

    public SongsAdapter(Context c, ArrayList<Song> theSongs){
        super();  
        songs=theSongs;
        songInf=LayoutInflater.from(c);
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return songs.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
        RowWrapper wrapper;
        if (convertView == null)
        {
            convertView = songInf.inflate(
                R.layout.song_row, null);
            wrapper = new RowWrapper(convertView);
            convertView.setTag(wrapper);
        }
        else
        {
            wrapper = (RowWrapper) convertView.getTag();
        }
        Song song = (Song) getItem(position);
        wrapper.populate(song);

        return convertView;
    }

    private static class RowWrapper
    {
        private TextView titleTextView;
        private TextView artistTextView;
        private TextView albumTextView;

        public RowWrapper(View convertView)
        {
            titleTextView = (TextView) 
                convertView.findViewById(R.id.textTitle);
            artistTextView = (TextView) 
                convertView.findViewById(R.id.textArtist);
            albumTextView = (TextView) 
                convertView.findViewById(R.id.textAlbum);
        }

        public void populate(Song song)
        {
            titleTextView.setText(song.title);
            artistTextView.setText(song.artist);
            albumTextView.setText(song.album);
        }
    }

}

您混合了初始化顺序:

首先,创建并启动活动(
onCreate
->
onStart
),然后活动中的
ViewPager
将通过
FragmentPagerAdapter\getItem
实现请求合适的片段(取决于
ViewPager
的当前位置/页面)

只有在
getItem
中实例化的相应片段才会被附加和膨胀(回调到
fragment\onCreateView
)。因此,在
Activity#onStart
时,还没有包含您试图定位的
listView
的片段,因此
findViewById
为空

因此,我们的想法是在列表视图膨胀之前不要访问它。这意味着您应该将逻辑从
活动#用歌曲充气
移动到
文件片段#onCreateView

// 1. get hold of `songList` : two options, see below

// 2. create new SongsAdapter
SongsAdapter songsAdt = new SongsAdapter(getActivity(), songsList);

// 3. inflate root view , locate listView in it and set the adapter
View view = inflater.inflate(R.layout.fragment_files, container, false);
ListView songsView = (ListView) view.findViewById(R.id.list);
songsView.setAdapter(songsAdt);

// 4. return inflated root view
return view;
要从片段中访问歌曲列表,您可以:

  • ArrayList songsList
    列表完全移动到您的片段以及从
    contentProvider
    填充它的代码中(顺便说一句,您现在应该避免从UI线程上的contentProvider加载)

  • 在活动中保留
    songsList
    ,并在活动中添加额外的方法以访问它:


  • public ArrayList getSongsLists(){
    返回歌曲列表;
    }
    
    ,因此,从片段中,您可以:


    ArrayList songsList=((MainActivity)getActivity()).getSongsList();
    SongsAdapter songsAdt=新的SongsAdapter(getActivity(),songsList);
    //等等。。。
    
    在您尝试调用
    findViewById
    时,您能否确保片段的
    onCreateView
    已被调用?@kiruwka:我不知道。在onCreateView之后,如何运行inflateWithSongs void?首先验证序列。你能不能放一个断点或日志语句来看看它们的调用顺序。@kiruwka:uhm。。。onStart包含FlameWithSongs(包含findoViewById),在onCreateView之前运行。我收到了onStart的日志消息,但没有收到onCreateView的日志消息。@kiruwka:如果我在onCreate中放入inflateWithSongs(),我注意到我没有收到onCreateView的日志语句。我删除了onStart,并在tabs()之后将其所有的空白都放在了onCreate中。。。当我在设备上运行应用程序时,即使onStart(即使为空)的存在也会导致强制关闭。所以,正如我所说,我把所有的都放在了onCreate中。但是我没有得到onCreateView的log语句,不管我做什么。即使delete inflateWithSongs()并毫无问题地运行我的应用程序,我也不会得到onCreateView的log语句。这有多可能?我知道这其中的逻辑,但现在我有两个问题:1。类型FragmentActivity 2的方法getSongsList()未定义。无法从类型活动对非静态方法findViewById(int)进行静态引用