最近完成した、以前にリリースされた iOS プロジェクトの Android への移植に取り組んでいます。このアプリは、サイトから XML を解析し、XML 要素のテキストを ListView に入力します。XML 解析部分は問題なくダウンしています。私が直面している問題は、このデータを ListView にロードすることです。各行に入力されるテキストとボタンを処理するカスタム アダプターがありますが、アダプターを設定した行でアプリがクラッシュします: lv.setAdapter(adap)。エラーは Null ポインター例外です。以下のエラーとコード。ListView とアダプターの手順が不足していると思います。また、ArrayList menuItems にデータがあり、null でないことも確認しました。これについて私が得ることができる入力、ガイダンス、またはフィードバックは大歓迎です。
FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to startactivity
ComponentInfo{tv.undignified.android/tv.undignified.android.Undignified}:
java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/ java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/tv.undignified.android.Podcasts}: java.lang.NullPointerException
Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{tv.undignified.android/tv.undignified.android.Podcasts}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.startActivityNow(ActivityThread.java:2503)
at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:651)
at android.widget.TabHost.setCurrentTab(TabHost.java:323)
at android.widget.TabHost.addTab(TabHost.java:213)
at tv.undignified.android.Undignified.onCreate(Undignified.java:48)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
メインコード:
public class Podcasts extends ListActivity{
private static final String HASHMAP_ID = "_id";
private CustomAdapter adap;
static final String URL = "http://www.undignified.podbean.com/feed";
//XML Node Keys
static final String KEY_ITEM = "item";
static final String KEY_TITLE = "title";
static final String KEY_DESCRIPTION = "itunes:subtitle";
static final String KEY_PODCASTURL = "enclosure";
public static final ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.podcasts);
UndigParser uparser = new UndigParser();
String xml = uparser.getXmlFromURL(URL);
Document doc = uparser.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(KEY_ITEM);
for(int i = 0; i < nl.getLength(); i++){
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
map.put(KEY_TITLE, uparser.getValue(e, KEY_TITLE));
map.put(KEY_DESCRIPTION, uparser.getValue(e, KEY_DESCRIPTION));
map.put(KEY_PODCASTURL, uparser.getValue(e, KEY_PODCASTURL));
menuItems.add(map);
}
adap = new CustomAdapter(Podcasts.this, menuItems);
ListView lv = (ListView) findViewById(R.id.LinearLayout01);
lv.setAdapter(adap);
}
public static class CustomAdapter extends BaseAdapter implements Filterable{
private LayoutInflater mInflater;
private Context context;
public CustomAdapter(Context context, ArrayList<HashMap<String,String>>menuItems){
mInflater = LayoutInflater.from(context);
this.context = context;
}
public View getView(final int position, View convertView, ViewGroup parent){
ViewHolder holder;
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.description=(TextView)convertView.findViewById(R.id.description);
holder.podcasturl=(TextView)convertView.findViewById(R.id.podcasturl);
holder.title=(TextView)convertView.findViewById(R.id.title);
holder.downloadBTN=(Button)convertView.findViewById(R.id.btnStartDownload);
convertView.setOnClickListener(new OnClickListener(){
private int pos = position;
@Override
public void onClick(View v){
Toast.makeText(context, "Text-" + String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
holder.downloadBTN.setOnClickListener(new OnClickListener(){
private int pos = position;
@Override
public void onClick(View v){
Toast.makeText(context, "Button-"+String.valueOf(pos), Toast.LENGTH_SHORT).show();
}
});
convertView.setTag(holder);
return convertView;
}
static class ViewHolder{
TextView description;
TextView title;
TextView podcasturl;
Button downloadBTN;
}
@Override
public int getCount() {
Log.d("Sizetest2343",""+menuItems.size());
return menuItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return null;
}
}
}
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="5dip">
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:android="http://schemas.android.com/apk/res/android">
<Button
android:id="@+id/startPodcastDownload"
android:layout_width="50dip"
android:layout_height="50dip"
android:focusable="false"
android:text="Download Podcast">
</Button>
</LinearLayout>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:layout_below="@id/title"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
<TextView
android:id="@+id/podcasturl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/LinearLayout01"
android:layout_below="@+id/description"
android:textColor="#acacac"
android:paddingBottom="2dip">
</TextView>
</RelativeLayout>