Problem bei Custom ListView und RSS-Feed Reader

  • 3 Antworten
  • Letztes Antwortdatum
blackfire185

blackfire185

Stamm-User
40
Hallo,
ich habe ein weiteres Problem und komme einfach nicht auf die Lösung. Ich hoffe jemand von euch findet den Fehler:

Ich habe einen RSS-Feed.
Diesen rufe ich in der AsyncTask nach diesem Beispielcode ab:

Dann möchte ich die Daten in einer ListView mit Cusotm Style darstellen.

DAzu habe ich die XML-Datei für jedes Item erstellt.

Dann die Klasse, welches die Daten sammelt, Details.java:
PHP:
public class Details {
	 
     String name;
     String desc;
     String time;

     public String getName() {
         return name;
     }

     public void setName(String name) {
         this.name = name;
     }
     public String getDesc() {
         return desc;
     }

     public void setDesc(String desc) {
         this.desc = desc;
     }
    
     
     
     public String getTime() {
         return time;
     }

     public void setTime(String time) {
         this.time = time;
     }
     
     
}

Dann nach Tutorial einen Adapter:

PHP:
public class CustomAdapter extends BaseAdapter {
	 
    private ArrayList _data;
    Context _c;
    
    CustomAdapter (ArrayList data, Context c){
        _data = data;
        _c = c;
    }
   
    public int getCount() {
        // TODO Auto-generated method stub
        return _data.size();
    }
    
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return _data.get(position);
    }
 
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
   
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
         View v = convertView;
         if (v == null)
         {
            LayoutInflater vi = (LayoutInflater)_c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_item, null);
         }
 
           
        
           TextView nameview = (TextView)v.findViewById(R.id.titel);
           TextView descview = (TextView)v.findViewById(R.id.decription);
           TextView timeView = (TextView)v.findViewById(R.id.time);
 
           Details msg = (Details) _data.get(position);
           nameview.setText(msg.name);
           descview.setText(msg.desc);
           timeView.setText(msg.time);                             
                        
        return v;
}
}

Dann wird in meiner Asynctask in der doinBackground der RSS Feed nach dem oben genannten Beispielcode aufgerufen und eigentlich in eine ArrayList details geschrieben werden:
PHP:
try {
				URL url = new URL("fedd.rss");

				XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
				factory.setNamespaceAware(false);
				XmlPullParser xpp = factory.newPullParser();

			        // We will get the XML from an input stream
				xpp.setInput(getInputStream(url), "UTF_8");

				Detail = new Details();
	           
	           
				
				boolean insideItem = false;

		        // Returns the type of current event: START_TAG, END_TAG, etc..
			int eventType = xpp.getEventType();


			while (eventType != XmlPullParser.END_DOCUMENT) {
				if (eventType == XmlPullParser.START_TAG) {

					if (xpp.getName().equalsIgnoreCase("item")) {
						insideItem = true;
					} else if (xpp.getName().equalsIgnoreCase("title")) {
						if (insideItem)
							Detail.setName(xpp.nextText()); //Test den Titel mit SetName zu setzen
					} else if (xpp.getName().equalsIgnoreCase("link")) {
						if (insideItem)
							links.add(xpp.nextText()); //extract the link of article
					}
					
				}else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
					insideItem=false;
				}
				details.add(Detail);
				eventType = xpp.next(); //move to next element
			}

Die ArrayList, die die Daten aufnehmen soll wird definiert:
PHP:
private class rsstask extends AsyncTask<String, Integer, String>{
		ArrayList<Details> details = new ArrayList();
		 Details Detail;

und zu guter letzt wird die Listview mit dem Adapter in der OnPostExecute verknüpft:
PHP:
protected void onPostExecute(String result){
			
			ListView lv1 = (ListView)findViewById(R.id.listView1);
			
			 lv1.setAdapter(new CustomAdapter(details, Fragen.this));
				
		}


Mein Problem: Die Listview zeigt immer nur den Letzten Eintrag des Rss Feeds an. (siehe Anhang Bild)

Meine Schlussfolgerung:
PHP:
details.add(Detail);
wird nur beim letzten Mal aufgerufen. Nur das ist irgendwie unlogisch, weil es ja sehr oft angezeigt wird und nicht nur ein mal.

Könnt ihr mir vielleicht helfen, ich sehe nämlich nicht, woran es liegen könnte.

Vielen Dank
Gruß
 

Anhänge

  • error.png
    error.png
    13,4 KB · Aufrufe: 226
Solltest du nicht innerhalb deiner Schleife ein Neues Detail anlegen
Code:
            while (eventType != XmlPullParser.END_DOCUMENT) { 
                if (eventType == XmlPullParser.START_TAG) { 
 
                    if (xpp.getName().equalsIgnoreCase("item")) { 
                        insideItem = true; 
[COLOR=#000000][COLOR=#0000BB]              [COLOR=Red]   Detail [/COLOR][/COLOR][COLOR=Red]= new Details[/COLOR][COLOR=#007700][COLOR=Red](); [/COLOR]

[/COLOR][/COLOR]


sonst fügst du immer wieder das selbe Detail zur Arraylist.
 
  • Danke
Reaktionen: blackfire185
Tatsache das habe ich im beispiel völlig übersehen da wird ja auch jedes mal bei einem neuen eintrqg neu erstellt. Danke ich werde es heute
Nachmittag mal probieren.


Also es funtkioniert nicht, so wie du vorgeschlagen hast. Wenn ich lediglich das Detial = new Details() an die Stelle ziehe kommt es zum NullPointerException:

01-22 17:02:03.312: E/AndroidRuntime(1603): FATAL EXCEPTION: main
01-22 17:02:03.312: E/AndroidRuntime(1603): java.lang.NullPointerException

01-22 17:02:03.312: E/AndroidRuntime(1603): at de.gute_mathe_fragen.CustomAdapter.getView(CustomAdapter.java:53)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.AbsListView.obtainView(AbsListView.java:2033)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.ListView.measureHeightOfChildren(ListView.java:1244)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.ListView.onMeasure(ListView.java:1155)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.RelativeLayout.measureChild(RelativeLayout.java:579)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:392)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
01-22 17:02:03.312: E/AndroidRuntime(1603): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.View.measure(View.java:12603)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.os.Handler.dispatchMessage(Handler.java:99)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.os.Looper.loop(Looper.java:137)
01-22 17:02:03.312: E/AndroidRuntime(1603): at android.app.ActivityThread.main(ActivityThread.java:4340)
01-22 17:02:03.312: E/AndroidRuntime(1603): at java.lang.reflect.Method.invokeNative(Native Method)
01-22 17:02:03.312: E/AndroidRuntime(1603): at java.lang.reflect.Method.invoke(Method.java:511)
01-22 17:02:03.312: E/AndroidRuntime(1603): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-22 17:02:03.312: E/AndroidRuntime(1603): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-22 17:02:03.312: E/AndroidRuntime(1603): at dalvik.system.NativeStart.main(Native Method)


Wenn ich das Detail an einer anderen Stelle in der Schleife anlege, bleibt die Listview komplett leer. WEnn ich das Deatil nach dem hinzufügen zur ArrayListe zu null mache (praktisch recykeln), gibts auch ein NullPointExeption.

Andere Ideen?
 
Zuletzt bearbeitet:
ALso ich habe jetzt diese leere Listview etwas nach unten gescrollt und Tatsache, aller ca. 20 Elemente kommt ein beschriebenes Feld, welches richtig beschrieben ist:
PHP:
int eventType = xpp.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				Detail = new Details();
				if (eventType == XmlPullParser.START_TAG) {
					if (xpp.getName().equalsIgnoreCase("item")) {
						insideItem = true;
						
					} else if (xpp.getName().equalsIgnoreCase("title")) {
						if (insideItem){
							i++;
							
							Detail.setName(xpp.nextText()); //extract the headline
							Log.d("mathe", String.valueOf(i));
						}
					} else if (xpp.getName().equalsIgnoreCase("link")) {
						if (insideItem)
							links.add(xpp.nextText()); //extract the link of article
						
						
					}
					
				}else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
					insideItem=false;
				}
				
				details.add(Detail);
				eventType = xpp.next(); //move to next element
			}

Laut Logcat wird 50mal (richtigerweise) setName aufgerufen.


Die Listview ist auch länger als 50 Items.

Dann ist ja eigentlich das Problem, das details.add(Detail) nicht gleich oft aufgerufen wird, wie wie es Items gibt, sondern jedes mal 20 Mal, bevor es wieder zur richtigen Zeit aufgerufen wird. Das finde ich irgendwie merkwürdig.

Der ursprüngliche Beitrag von 19:08 Uhr wurde um 19:22 Uhr ergänzt:

Jetzt raff ichs.

DIE LÖSUNG:

Warum alle Einträge gleich waren?
--> kein Detail neu angelegt
--> Detail = new Details();
-> direkt nach dem while Statement. Dies erzeugt zwar nach der folgenden Beschreibung 1020 neue Details, aber es werden ja nciht alle Details zur Liste hinzugefügt

Warum viele leere Einträge zwischen drinnen waren:
--> details.add(Detail) wurde an einer Stelle aufgerufen, welche 1020 mal aufgerufen wird --> 1020 listItems.

Der endgültige Code mit aufrufen einzelner Zeilen:
PHP:
int eventType = xpp.getEventType();
			while (eventType != XmlPullParser.END_DOCUMENT) {
				Detail = new Details();
				
				if (eventType == XmlPullParser.START_TAG) {
					if (xpp.getName().equalsIgnoreCase("item")) {
						insideItem = true;
						//Aufrufe 350 mal
						
						
					} else if (xpp.getName().equalsIgnoreCase("title")) {
						if (insideItem){
							i++;
							
							Detail.setName(xpp.nextText()); //Aufrufe 50 = Länge des Rss Feeds
							details.add(Detail);
							Log.d("mathe", String.valueOf(i));
						}
					} else if (xpp.getName().equalsIgnoreCase("link")) {
						if (insideItem)
							links.add(xpp.nextText()); //extract the link of article
						
						
					}
					
				}else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){
					insideItem=false;
				}
				
				//Aufrufe 1020 Mal
				
				eventType = xpp.next(); //move to next element
			}

Jetzt wird mir auch klar, wie der XMLPullParser in Etwa funktioniert und warum es falsch war, die Daten an der Stelle zur Liste hinzuzufügen, an der der Code 1020 mal aufgerufen wurde.

Gruß
 
Zurück
Oben Unten