2013-03-27 53 views
0

參考This教程,自定義列表查看Android捕捉異常

我正在努力從url獲取縮略圖。該customizedListView類:

public class CustomizedListView extends Activity 

{ 
// All static variables 
static final String URL = "http://173.193.24.66/~kanz/video/XML/9.xml"; 
// XML node keyse. 
static final String KEY_SONG = "item"; // parent node 
static final String KEY_TITLE = "title"; 
static final String KEY_ARTIST = "description"; 
static final String KEY_DURATION = "duration"; 
static final String KEY_THUMB_URL = "image"; 
ListView list; 
LazyAdapter adapter; 

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

    ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>(); 

    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); // getting XML from URL 
    Document doc = parser.getDomElement(xml); // getting DOM element 

    NodeList nl = doc.getElementsByTagName(KEY_SONG); 
    // looping through all song nodes <song> 
    for (int i = 0; i < nl.getLength(); i++) { 
     // creating new HashMap 
     HashMap<String, String> map = new HashMap <String, String>(); 
     Element e = (Element) nl.item(i); 
     // adding each child node to HashMap key => value 
     map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
     map.put(KEY_ARTIST, parser.getValue(e, KEY_ARTIST)); 
     map.put(KEY_DURATION, parser.getValue(e, KEY_DURATION)); 
     map.put(KEY_THUMB_URL, parser.getValue(e, KEY_THUMB_URL)); 

     // adding HashList to ArrayList 
     songsList.add(map); 
    } 

    list=(ListView)findViewById(R.id.list); 

    // Getting adapter by passing xml data ArrayList 
    adapter=new LazyAdapter(this, songsList); 
    list.setAdapter(adapter); 

    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      Context context = getApplicationContext(); 
      Intent in = new Intent(context, SingleMenuItemActivity.class); 
      in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     
      context.startActivity(in); 

     } 
    }); 
} 

}

我的適配器

public class LazyAdapter extends BaseAdapter { 
private Activity activity; 
private ArrayList <HashMap<String, String>> data;  
private static LayoutInflater inflater=null; 
public ImageLoader imageLoader; 

public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
    activity = a; 
    data=d; 
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    imageLoader=new ImageLoader(activity.getApplicationContext()); 
} 

public int getCount() { 
    return data.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View vi=convertView; 
    if(convertView==null) 
     vi = inflater.inflate(R.layout.list_row, null); 

    TextView title = (TextView)vi.findViewById(R.id.title); // title 
    TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name 
    TextView duration = (TextView)vi.findViewById(R.id.duration); // duration 
    ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image 

    HashMap<String, String> song = new HashMap<String, String>(); 
    song = data.get(position); 

    // Setting all values in listview 
    title.setText(song.get(CustomizedListView.KEY_TITLE)); 
    artist.setText(song.get(CustomizedListView.KEY_ARTIST)); 
    duration.setText(song.get(CustomizedListView.KEY_DURATION)); 
    imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image); 
    return vi; 
} 

}

雖然logcat的給空指針異常。

03-27 19:16:29.321: E/AndroidRuntime(1516): FATAL EXCEPTION: main 
03-27 19:16:29.321: E/AndroidRuntime(1516): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.razatubevidurl/com.example.razatubevidurl.CustomizedListView}: java.lang.NullPointerException 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.os.Looper.loop(Looper.java:137) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at dalvik.system.NativeStart.main(Native Method) 
03-27 19:16:29.321: E/AndroidRuntime(1516): Caused by: java.lang.NullPointerException 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at com.example.razatubevidurl.CustomizedListView.onCreate(CustomizedListView.java:49) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.Activity.performCreate(Activity.java:5104) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
03-27 19:16:29.321: E/AndroidRuntime(1516):  ... 11 more 

請幫我解釋我做錯了什麼。 logcat提供了這個例外,並在模擬器上我得到一個警告說:「不幸的是,myApp已經停止」任何幫助將不勝感激。謝謝。 PS:我已經提到了清單中的所有活動,並擁有所有權限。

編輯:這是我的XML:

<playlist><title>![CDATA[New Playlist]]</title> 
<items> 
<item> 
<title>HAMD(LA ILAHA ILLALLAH)</title> 
<description>Recited By :Alhaaj Muhammad Owais Raza Qadri -- Written By: Mufti-e-Azam Hind Molana Mustafa Raza Khan Noori</description> 
<image>http://173.193.24.66/~kanz/video/Images/9.jpg</image> 

<startFromThis>true</startFromThis> 
<duration>510</duration> 
<source>http://173.193.24.66/~kanz/video/flv/9.flv</source> 
<sourceAlt>http://173.193.24.66/~kanz/video/mp4/9.mp4</sourceAlt>  

<sourceType>direct</sourceType> 
</item> 
</items> 
</playlist> 
+2

如果您發佈完整的日誌消息,它將對您有幫助。 – 2013-03-27 10:39:28

+0

@ android.fryo查看我更新的問題 – 2013-03-27 19:19:28

+0

你可以發佈完整的CustomizedListView類嗎?日誌文件中的行號告訴我們什麼都沒有。 – coderek 2013-03-28 00:58:05

回答

0

兩個原因

  • 你有沒有在聲明的活動你的表現爲:

<activity android:name="com.example.razatubevidurl.CustomizedListView"/>

  • 如果沒有由於上述原因,你可以檢查活動課的名字,一定有一些錯字。
+0

沒有錯別字pks – 2013-03-27 14:07:52

+0

@AbdusSamiKhan然後發佈完整日誌。 – Prateek 2013-03-27 16:56:02

+0

查看最新的問題,並讓我知道如果你認爲有什麼問題。 – 2013-03-27 19:19:57

0

你有一個<ListView/>裏面的佈局文件?

它可能沒有找到id爲list的元素。

+0

我在佈局中有一個listView .. – 2013-03-27 14:03:45

+0

我已經在佈局中有一個ListView – 2013-03-27 14:28:24

0

我解決了問題,通過編輯的方法getDomElement(在XMLParser的類)就像這樣:

public Document getDomElement(String xml){ 
Document doc = null; 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
try { 

     DocumentBuilder db = dbf.newDocumentBuilder(); 

    // InputSource is = new InputSource(); 
     //  is.setCharacterStream(new StringReader(xml)); 
      doc = db.parse("http://x.x.x.x/~kanz/video/XML/9.xml"); 

     } catch (ParserConfigurationException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (SAXException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } catch (IOException e) { 
      Log.e("Error: ", e.getMessage()); 
      return null; 
     } 

     return doc; 
} 

我不知道爲什麼,但註釋掉

InputSource is = new InputSource(); 
is.setCharacterStream(new StringReader(xml)); 

和傳球后直接到db.parse的URL解決了我的問題。希望它也能幫助別人!