Android 在具有片段的活动中为listview设置适配器时发生Nullpointerexception
我正在开发一个非常小的音频播放器,但有时我会遇到一些让我发疯的错误。现在,当我为ListView(外部存储上的音频文件列表)设置适配器时,我面临一个NullPointerException。 我只使用了一个带有actionbar和两个选项卡的活动(两个片段可以通过swype切换)。我还没有为玩家实现控件,我还在开发列表 MainActivity.javaAndroid 在具有片段的活动中为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
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)进行静态引用