Jsoup - Leere Zeilen ignorieren

M

MaxDev

Neues Mitglied
3
Guten Abend liebes Forum,

ich programmiere derzeit eine App für meine Schule, die den Vertretungsplan darstellen soll.
Die Daten kommen aus einer HTML Tabelle aus dem Netz (Beispiel für 5a: https://service.copernicus-gymnasium.de/vertretungsplan/schueler/w/13/w00001.htm)

Ich importiere die Daten per Jsoup aus der Tabelle, was auch wunderbar klappt. Wie man aber in dem Link sehen kann, gibt es Felder, bei denen Klasse, Datum, Stunde, ... nicht vorhanden / leer sind, weil der Vertretungstext über mehrere Zeilen geht.
In der App resultiert dass dann in leeren Spalten und der Vertretungstext wird abgehackt wiedergegeben, weil jsoup einfach das macht, was ihm gesagt wurde.

Nun stehe ich vor dem Problem, und weiß nicht, wie ich die leeren Spalten in der App unsichtbar machen kann, und den Text zusammenfügen kann, wie es eigentlich sein soll.

Ich habe als Vorlage für die bisherige Programmierung folgende Anleitung genutzt: Android JSOUP ListView Images and Texts from HTML Tables Tutorial - AndroidBegin

Ich habe euch mal ein Bild angehängt, was das alles verdeutlichen soll.
- Leere Zeilen: grün
- Vertretungstext über mehrere Zeilen: rot

An Ende sollte dann im Bild die komplette grüne Spalte verschwunden sein, und der rote Text zusammengelegt werden.
Ich hoffe mal, ihr versteht, wie ich das meine.

Meine Überlegung war jetzt, mit if-Anweisungen zu arbeiten, die dann die Zeile ausblendet, wenn z.B. der Eintrag bei Tag oder Stunde leer ist - nur wie klappt das?

Code:
<?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="fill_parent" >
 

    <TextView
        android:id="@+id/art"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <TextView
        android:id="@+id/datumlabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/art"
        android:text="@string/datumlabel" />
 
    <TextView
        android:id="@+id/datum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/datumlabel" />
 
    <TextView
        android:id="@+id/stdlabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/datum"
        android:text="@string/stdlabel" />
 
    <TextView
        android:id="@+id/std"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/stdlabel" />
    
    <TextView
        android:id="@+id/stdlabel2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/std" 
        android:text="@string/stdlabel2"/>
    
    <TextView
        android:id="@+id/fachlabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/art"
        android:text="@string/fachlabel" />
 
    <TextView
        android:id="@+id/fach"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/datumlabel"
        android:layout_toRightOf="@+id/fachlabel" />
    
    <TextView
        android:id="@+id/raumlabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/fach"
        android:layout_below="@+id/datum"
        android:text="@string/raumlabel" />
 
    <TextView
        android:id="@+id/raum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/stdlabel"
        android:layout_toRightOf="@+id/raumlabel" />
    
    <TextView
        android:id="@+id/fach2label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/fachlabel"
        android:text="@string/fach2label" />
 
    <TextView
        android:id="@+id/fach2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/fach"
        android:layout_toRightOf="@+id/fach2label" />
    
   <TextView
        android:id="@+id/vertretungstextlabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/fach2label"
        android:text="@string/vertretungstextlabel" />
 
   <TextView
        android:id="@+id/vertretungstext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/fach2"
        android:layout_toRightOf="@+id/vertretungstextlabel" />
    
</RelativeLayout>
Code:
package com.maxdev.copgymvertretung;

import com.maxdev.copgymvertretung.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SingleItemView extends Activity {
	// Declare Variables
	String kl;
	String datum;
	String std;
	String fach;
	String raum;
	String art;
	String fach2;
	String vertretungstext;
	String position;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Get the view from singleitemview.xml
		setContentView(R.layout.singleitemview);
 
		Intent i = getIntent();
		// Get the result of rank
		//kl = i.getStringExtra("kl");
		datum = i.getStringExtra("datum");
		std = i.getStringExtra("std");
		fach = i.getStringExtra("fach");
		raum = i.getStringExtra("raum");
		art = i.getStringExtra("art");
		fach2 = i.getStringExtra("fach2");
		vertretungstext = i.getStringExtra("vertretungstext");
 
		// Locate the TextViews in singleitemview.xml
		//TextView txtkl = (TextView) findViewById(R.id.kl);
		TextView txtdatum = (TextView) findViewById(R.id.datum);
		TextView txtstd = (TextView) findViewById(R.id.std);
		TextView txtfach = (TextView) findViewById(R.id.fach);
		TextView txtraum = (TextView) findViewById(R.id.raum);
		TextView txtart = (TextView) findViewById(R.id.art);
		TextView txtfach2 = (TextView) findViewById(R.id.fach2);
		TextView txtvertretungstext = (TextView) findViewById(R.id.vertretungstext);
		
		// Set results to the TextViews
		//txtkl.setText(kl);
		txtdatum.setText(datum);
		txtstd.setText(std);
		txtfach.setText(raum);
		txtraum.setText(fach);
		txtart.setText(art);
		txtfach2.setText(fach2);
		txtvertretungstext.setText(vertretungstext);
		
 
	}
}
 

Anhänge

  • Screenshot_2015-03-30-17-16-40.png
    Screenshot_2015-03-30-17-16-40.png
    70,3 KB · Aufrufe: 189
if(!koennteEinLeererStringSein.isEmpty()){
doStuff();
}
 
So weit bin ich auch schon...
Ich hätte folgendes in die SingleItemView reingepackt:

Code:
import android.view 
		
//Remove empty lines
if(txtdatum.isEmpty())
{
txtdatum.setVisibility(View.GONE);
txtdatumlabel.setVisibility(View.GONE);
}

Dass hier dann noch die anderen alle dazu müssen, ist mir bewusst.
Allerdings ist die Methode isEmpty nicht für die Textview definiert, außerdem muss ich das txtdatumlabel irgendwo noch konfigurieren.
 
Code:
if(txtdatum.getText().toString().isEmpty()){ ... }
Für's Label, sofern Du zur Laufzeit im Javacode den Text ändern willst, ansonsten weiß ich nicht, was Du mit konfigurieren meinst...
Code:
txtdatumlabel.setText("Neuer Text");
 
  • Danke
Reaktionen: MaxDev
Damit meine ich, dass txtdatumlabel ja in diesem Fall nicht definiert ist.

Es kennt das ja nicht. da das Label nur in der obenstehenden XML Datei drinnen ist.
 

Anhänge

  • Screenshot (19).png
    Screenshot (19).png
    6,4 KB · Aufrufe: 181
Woher hast du denn dann das txtdatum? Das muss ja da (vor dem if) auch irgendwo deklariert werden?

Irgendwo vorher müsste sowas wie
TextView txtdatum = findviewById(R.id.datum);
stehen oder?

Dementsprechend musst Du natürlich auch das Label deklarieren, also sowas wie: TextView txtdatumlabel = findviewById(R.id.datumlabel);

Edit:
Mhh, ja, wenn man genau hinguckt, dann sieht man auch, dass Du ja schon von Anfang an den relevanten Codeteil gepostet hattest...

Dann also da, wo Du auch deine anderen TextViews deklarierst:
TextView txtdatumlabel = (TextView) findViewById(R.id.datumlabel);
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: MaxDev
Das txtdatum wurde schon vorher wie du gesagt hast deklariert.
Ich habe im Ausgangpost ja 2 Spoiler eingefügt. Im letzten Spoiler steht das, wenn du etwas herunterscrollst drinnen.

Okay, hat geklappt. Das Label ist dann schon einmal verschwunden. Jetzt muss ich nur noch testen, was passiert, wenn alles verschwindet.

Das Textzusammenfügen wäre dann leider die nächste Baustelle.
 
Mhh, ich hab mir jetzt mal deine HTML Tabelle angesehen und versteh das Problem (mit dem Zusammenfügen des Textes) jetzt besser.

Ich nehm mal an, dass Du eine Main(?) Acticity hast, die holt und zerlegt die ganzen Daten, ordnet das Ganze und dann rufst Du SingleItemView auf und ordnest dann die Daten dem jeweiligen View/Eintrag zu?

In dem Fall wäre wohl einfacher, schon in der Main Activity zu entscheiden, ob Du einen Eintrag überhaupt anzeigst oder nicht.
Sprich z.B. wenn Du weißt, Eintrag #3 ist leer (das kannst Du ja schon in Main prüfen), dann rufst Du SingleItemView dafür gar nicht erst auf.
So sparst Du dir das Ganze isEmpty() / .GONE Zeug in SingleItemView. Du musst dann halt schon in Main auf isEmpty() prüfen.

Und in Main kannst Du in dem Fall auf den Rest des folgenden, leeren Eintrags bzw. seinen Vertretungstext zugreifen.
Dies wird wohl in SingleViewItem so gar nicht gehen, da Du hier keine Kenntnisse von den anderen Einträgen hast.
 
So langsam blicke ich hier absolut nicht mehr durch...
Ich bin vorhin durcheinander gekommen.

Die SingleItemView ist dazu da, dass, sofern auf einen der Einträge in der Hauptansicht geklickt wird, dieser Extra geöffnet wird.
Die Daten am Anfang wie im Screenshot darstellen mache ich mit der ListViewAdapter.java, in die ich jetzt auch den Code zum Verschwinden der Einträge eingetragen habe.
Allerdings klappt das hier wohl doch nicht. Die Einträge werden dennoch angezeigt, als würde der Code ignoriert werden

Die komplette ListViewItem:
Code:
package com.maxdev.copgymvertretung;

import java.util.ArrayList;
import java.util.HashMap;

import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListViewAdapter extends BaseAdapter {

	// Declare Variables
	Context context;
	LayoutInflater inflater;
	ArrayList<HashMap<String, String>> data;
	ImageLoader imageLoader;
	HashMap<String, String> resultp = new HashMap<String, String>();

	public ListViewAdapter(Context context,
			ArrayList<HashMap<String, String>> arraylist) {
		this.context = context;
		data = arraylist;
		imageLoader = new ImageLoader(context);
	}

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

	@Override
	public Object getItem(int position) {
		return null;
	}

	@Override
	public long getItemId(int position) {
		return 0;
	}

	public View getView(final int position, View convertView, ViewGroup parent) {
		// Declare Variables
		//TextView kl;
		TextView datum;
		TextView std;
		TextView fach;
		TextView raum;
		TextView art;
		TextView fach2;
		TextView vertretungstext;
		
		TextView datumlabel;
		TextView stdlabel;
		TextView stdlabel2;
		TextView fachlabel;
		TextView raumlabel;
		TextView fach2label;
		TextView vertretungstextlabel;
 
		inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
		View itemView = inflater.inflate(R.layout.listview_item, parent, false);
		// Get the position
		resultp = data.get(position);
 
		// Locate the TextViews in listview_item.xml
		//kl = (TextView) itemView.findViewById(R.id.kl);
		datum = (TextView) itemView.findViewById(R.id.datum);
		std = (TextView) itemView.findViewById(R.id.std);
		fach = (TextView) itemView.findViewById(R.id.fach);
		raum = (TextView) itemView.findViewById(R.id.raum);
		art = (TextView) itemView.findViewById(R.id.art);
		fach2 = (TextView) itemView.findViewById(R.id.fach2);
		vertretungstext = (TextView) itemView.findViewById(R.id.vertretungstext);
		
		datumlabel = (TextView) itemView.findViewById(R.id.datumlabel);
		stdlabel = (TextView) itemView.findViewById(R.id.stdlabel);
		stdlabel2 = (TextView) itemView.findViewById(R.id.stdlabel2);
		fachlabel = (TextView) itemView.findViewById(R.id.fachlabel);
		raumlabel = (TextView) itemView.findViewById(R.id.raumlabel);
		fach2label = (TextView) itemView.findViewById(R.id.fach2label);
		vertretungstextlabel = (TextView) itemView.findViewById(R.id.vertretungstextlabel);
 
		// Capture position and set results to the TextViews
		//kl.setText(resultp.get(MainActivity.KL));
		datum.setText(resultp.get(MainActivity.DATUM));
		std.setText(resultp.get(MainActivity.STD));
		fach.setText(resultp.get(MainActivity.FACH));
		raum.setText(resultp.get(MainActivity.RAUM));
		art.setText(resultp.get(MainActivity.ART));
		fach2.setText(resultp.get(MainActivity.FACH2));
		vertretungstext.setText(resultp.get(MainActivity.VERTRETUNGSTEXT));
		
		//Remove empty lines
		if(datum.getText().toString().isEmpty())
		{
			datum.setVisibility(View.GONE);
			datumlabel.setVisibility(View.GONE);
			std.setVisibility(View.GONE);
			stdlabel.setVisibility(View.GONE);
			stdlabel2.setVisibility(View.GONE);
			fach.setVisibility(View.GONE);
			fachlabel.setVisibility(View.GONE);
			raum.setVisibility(View.GONE);
			raumlabel.setVisibility(View.GONE);
			fach2.setVisibility(View.GONE);
			fach2label.setVisibility(View.GONE);
			vertretungstext.setVisibility(View.GONE);
			vertretungstextlabel.setVisibility(View.GONE);
			art.setVisibility(View.GONE);
		}
		
		// Capture ListView item click
		itemView.setOnClickListener(new OnClickListener() {
 
			@Override
			public void onClick(View arg0) {
				// Get the position
				resultp = data.get(position);
				Intent intent = new Intent(context, SingleItemView.class);
				// Pass all data rank
				//intent.putExtra("kl", resultp.get(MainActivity.KL));
				intent.putExtra("datum", resultp.get(MainActivity.DATUM));
				intent.putExtra("std",resultp.get(MainActivity.STD));
				intent.putExtra("fach", resultp.get(MainActivity.FACH));
				intent.putExtra("raum", resultp.get(MainActivity.RAUM));
				intent.putExtra("art", resultp.get(MainActivity.ART));
				intent.putExtra("fach2", resultp.get(MainActivity.FACH2));
				intent.putExtra("vertretungstext", resultp.get(MainActivity.VERTRETUNGSTEXT));
				
				// Start SingleItemView Class
				context.startActivity(intent);
 
			}
		});
		
		return itemView;
	}
}

Die MainActivity:
Code:
package com.maxdev.copgymvertretung;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Calendar;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {
	ListView listview;
	ListViewAdapter adapter;
	ProgressDialog mProgressDialog;
	ArrayList<HashMap<String, String>> arraylist;
	Calendar now = Calendar.getInstance();
	static String KL = "kl";
	static String DATUM = "datum";
	static String STD = "std";
	static String FACH = "fach";
	static String RAUM = "raum";
	static String ART = "art";
	static String FACH2 = "(fach)";
	static String VERTRETUNGSTEXT = "vertretungstext";
	// URL Address
	String url = ("https://service.copernicus-gymnasium.de/vertretungsplan/schueler/w/13/w00001.htm");

	public static void enableSSLSocket() throws KeyManagementException, NoSuchAlgorithmException {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });
 
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new X509TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
 
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            }
 
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }}, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
    }
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Get the view from listview_main.xml
		setContentView(R.layout.listview_main);
		// Execute DownloadJSON AsyncTask
		new JsoupListView().execute();

	}

	// Title AsyncTask
	private class JsoupListView extends AsyncTask<Void, Void, Void> {

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			// Create a progressdialog
			mProgressDialog = new ProgressDialog(MainActivity.this);
			// Set progressdialog title
			mProgressDialog.setTitle("CopGym Vertretungsplan");
			// Set progressdialog message
			mProgressDialog.setMessage("Loading...");
			mProgressDialog.setIndeterminate(false);
			// Show progressdialog
			mProgressDialog.show();
		}

		@Override
		protected Void doInBackground(Void... params) {
			// Create an array
			arraylist = new ArrayList<HashMap<String, String>>();

			try {
				// Connect to the Website URL
				enableSSLSocket();
				Document doc = Jsoup.connect(url).get();
				// Identify Table Class "Vertretung"
				for (Element table : doc.select("table")) {
					
					// Identify all the table row's(tr)
					for (Element row : table.select("tr:gt(0)")) {
						HashMap<String, String> map = new HashMap<String, String>();
						
						// Identify all the table cell's(td)
						Elements tds = row.select("td");
						
						// Retrive Jsoup Elements
						// Get the first td
						map.put("kl", tds.get(0).text());
						// Get the second td
						map.put("datum", tds.get(1).text());
						// Get the third td
						map.put("std", tds.get(2).text());
						// Get the fourth td
						map.put("fach", tds.get(3).text());
						// Get the 5th td
						map.put("raum", tds.get(4).text());
						// Get the 6th td
						map.put("art", tds.get(5).text());
						// Get the 7th td
						map.put("(fach)", tds.get(6).text());
						// Get the 8th td
						map.put("vertretungstext", tds.get(7).text());
						// Set all extracted Jsoup Elements into the array
						arraylist.add(map);
					}
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (KeyManagementException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			// Locate the listview in listview_main.xml
			listview = (ListView) findViewById(R.id.listview);
			// Pass the results into ListViewAdapter.java
			adapter = new ListViewAdapter(MainActivity.this, arraylist);
			// Set the adapter to the ListView
			listview.setAdapter(adapter);
			// Close the progressdialog
			mProgressDialog.dismiss();
		}
	}

}

Sowie die SingleItemView:
Code:
package com.maxdev.copgymvertretung;

import com.maxdev.copgymvertretung.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SingleItemView extends Activity {
	// Declare Variables
	String kl;
	String datum;
	String std;
	String fach;
	String raum;
	String art;
	String fach2;
	String vertretungstext;
	String position;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// Get the view from singleitemview.xml
		setContentView(R.layout.singleitemview);
 
		Intent i = getIntent();
		// Get the result of rank
		//kl = i.getStringExtra("kl");
		datum = i.getStringExtra("datum");
		std = i.getStringExtra("std");
		fach = i.getStringExtra("fach");
		raum = i.getStringExtra("raum");
		art = i.getStringExtra("art");
		fach2 = i.getStringExtra("fach2");
		vertretungstext = i.getStringExtra("vertretungstext");
 
		// Locate the TextViews in singleitemview.xml
		//TextView txtkl = (TextView) findViewById(R.id.kl);
		TextView txtdatum = (TextView) findViewById(R.id.datum);
		TextView txtstd = (TextView) findViewById(R.id.std);
		TextView txtfach = (TextView) findViewById(R.id.fach);
		TextView txtraum = (TextView) findViewById(R.id.raum);
		TextView txtart = (TextView) findViewById(R.id.art);
		TextView txtfach2 = (TextView) findViewById(R.id.fach2);
		TextView txtvertretungstext = (TextView) findViewById(R.id.vertretungstext);
		
		
		
		// Set results to the TextViews
		//txtkl.setText(kl);
		txtdatum.setText(datum);
		txtstd.setText(std);
		txtfach.setText(raum);
		txtraum.setText(fach);
		txtart.setText(art);
		txtfach2.setText(fach2);
		txtvertretungstext.setText(vertretungstext);
		
 
	}
}

Ich würde dir gerne den Code komplett zukommen lassen, damit es für dich eventuell etwas übersichtlicher ist. Wäre das möglich?
 
Joar, das mit dem kompletten Code wäre hilfreich.

Am einfachsten wäre wohl ein Export aus deiner IDE (Eclipse/AndroidStudio/Whatever). Dann das Ganze ggf. Zippen, irgendwo hochladen (DropBox/GoogleDrive/oder so) und mir den Link (per PM?) schicken.

Du kannst das Ganze hier auch natürlich posten, dann haben mehr Leute Gelegenheit sich das anzusehen.
 
  • Danke
Reaktionen: MaxDev
PM ist raus. Wenn Du mir helfen würdest, wäre ich dir super dankbar!
 

Ähnliche Themen

A
Antworten
0
Aufrufe
874
andymcnab
A
T
Antworten
4
Aufrufe
1.234
jogimuc
J
HoerMirAuf
Antworten
3
Aufrufe
843
jogimuc
J
Zurück
Oben Unten