Android Java应用程序在设置ListAdapter时崩溃
我的Android应用程序在尝试将适配器链接到ListView时崩溃 这是我的活动Android Java应用程序在设置ListAdapter时崩溃,java,android,listview,Java,Android,Listview,我的Android应用程序在尝试将适配器链接到ListView时崩溃 这是我的活动 package needforbleed.com.music; import android.content.Context; import android.provider.MediaStore; import android.support.design.widget.TabLayout; import android.support.design.widget.FloatingActionButton;
package needforbleed.com.music;
import android.content.Context;
import android.provider.MediaStore;
import android.support.design.widget.TabLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.net.Uri;
import android.content.ContentResolver;
import android.database.Cursor;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//vars
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
public ArrayList<Song> songList;
private ListView songView;
//methods
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Create the adapter that will return a fragment for each of the three
// primary sections of the activity.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager with the sections adapter.
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mViewPager);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
songList=new ArrayList<Song>();
songView = (ListView)findViewById(R.id.lv_titles);
getSongList();
Collections.sort(songList, new Comparator<Song>() {
public int compare(Song a, Song b) {
return a.getName().compareTo(b.getName());
}
});
SongAdapter songAdt = new SongAdapter(this,R.id.lv_titles, songList);
songView.setAdapter(songAdt);
/* for(int x=0;x<songList.size();x++) {
Toast toast = Toast.makeText(this,songList.get(x).getName(),Toast.LENGTH_SHORT);
toast.show();
}*///I used that loop to check songList for Content. It has content so that's not the error.
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:return Player.newInstance(0,"Player");
case 1:return Artists.newInstance(1,"Artists");
case 2:return Albums.newInstance(2,"Albums");
case 3:return Titles.newInstance(3,"Titles");
}
return null;
}
@Override
public int getCount() {
// Show 3 total pages.
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "Player";
case 1:
return "Artists";
case 2:
return "Albums";
case 3:
return "Titles";
}
return null;
}
}
public void getSongList() {
ContentResolver musicResolver = getContentResolver();
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if(musicCursor!=null && musicCursor.moveToFirst()){
//get columns
int titleColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);
int albumColumn=musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
//add songs to list
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
String thisAlbum = musicCursor.getString(albumColumn);
Song s=new Song();
s.setID(thisId);
s.setName(thisTitle);
s.setArtist(thisArtist);
s.setAlbum(thisAlbum);
songList.add(s);
}
while (musicCursor.moveToNext());
}
}
}
包需要bleed.com.music;
导入android.content.Context;
导入android.provider.MediaStore;
导入android.support.design.widget.TabLayout;
导入android.support.design.widget.FloatingActionButton;
导入android.support.design.widget.Snackbar;
导入android.support.v7.app.AppActivity;
导入android.support.v7.widget.Toolbar;
导入android.support.v4.app.Fragment;
导入android.support.v4.app.FragmentManager;
导入android.support.v4.app.FragmentPagerAdapter;
导入android.support.v4.view.ViewPager;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.ViewGroup;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.List;
导入android.net.Uri;
导入android.content.ContentResolver;
导入android.database.Cursor;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.widget.Toast;
公共类MainActivity扩展了AppCompatActivity{
//瓦尔斯
私人部门SPAGERAAdapter MSECTIONSPAGERAAdapter;
私有视图寻呼机mViewPager;
公共ArrayList歌曲列表;
私有列表视图;
//方法
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
//创建适配器,该适配器将为这三个函数中的每一个返回一个片段
//活动的主要部分。
mSectionsPagerAdapter=newsectionspageradapter(getSupportFragmentManager());
//使用分区适配器设置ViewPager。
mViewPager=(ViewPager)findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
TabLayout TabLayout=(TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(mviewpage);
FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Snackbar.make(查看“替换为您自己的操作”,Snackbar.LENGTH\u LONG)
.setAction(“Action”,null).show();
}
});
songList=newarraylist();
songView=(ListView)findViewById(R.id.lv_标题);
getSongList();
Collections.sort(songList,newcomparator(){
公共整数比较(歌曲a、歌曲b){
返回a.getName().compareTo(b.getName());
}
});
SongAdapter songAdt=新的SongAdapter(此,R.id.lv_标题,歌曲列表);
songView.setAdapter(songAdt);
/*对于(int x=0;x
应该是
SongAdapter songAdt = new SongAdapter(this,R.layout.layoutId, songList);
songView.setAdapter(songAdt);
其中layoutId是包含要在实例化视图时使用的TextView的布局文件的资源ID
您可以使用android提供的默认listitem布局,使用“android.R.layout.simple_list_item_1”作为布局id我猜没有。我在“songView=(ListView)findViewById(R.id.lv_titles);”中引用了它但是你知道一种检查方法吗?在初始化适配器之前,你确定getSongList
函数完成并返回值吗?确实如此。如果我删除了adepter链接的行,它工作正常。或者我误解了你的问题吗?@Needforbleed可能是id的输入错误吗?你能检查它是否与xml布局中的列表视图id匹配吗t?您可以添加日志来查看songView
是否为空。我认为songView
为空的原因是因为它是唯一适合您堆栈跟踪的位置,android.widget.ListView.setAdapter上的NPE。id是正确的。但我还是会检查它
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="needforbleed.com.music.Titles">
<!-- TODO: Update blank fragment layout -->
<ListView
android:layout_width="wrap_content"
android:layout_height="422dp"
android:id="@+id/lv_titles"
android:layout_gravity="left|top" />
</FrameLayout>
SongAdapter songAdt = new SongAdapter(this,R.id.lv_titles, songList);
songView.setAdapter(songAdt);
SongAdapter songAdt = new SongAdapter(this,R.layout.layoutId, songList);
songView.setAdapter(songAdt);