Я использую Eclipse для разработки приложения для Android 2.1 с использованием базовой библиотеки jsoup 1.6.1 для подключения к веб-странице и очистки HTML.До сих пор приложение, вставленное ниже, подключается к веб-странице с помощью метода jsoup connect
, создает документ с помощью метода jsoup get
, затем выбирает все строки таблицы Elements
, а затем получает все элементы этой строки таблицыс помощью jsoup getAllElements
, (в данном случае Elements), проверяет их на наличие текста и, если содержит определенную подстроку, преобразует текст в строку с помощью метода text
jsoup и добавляет их в коллекцию строк ListArray, отображаяих в андроиде ListView
.Ниже приведены мои 2 вопроса, а затем код.
Кажется, что код работает на моем эмуляторе, возвращая данные строк, однако есть ошибка, при которой Android отображает каждую строку с информацией String в двух экземплярах, которую яне могу отследить.
Кроме того, я хотел знать, существует ли более оптимальный метод для более быстрого выполнения этих задач с использованием jsoup или другой библиотеки java / android, и хотел узнать какие-либо предложения.Например, кажется, что когда я запускаю этот код на странице, содержащей много данных, это занимает немного больше времени, чем мне бы хотелось.Например, я загружаю всю страницу и создаю jsoup doc
перед выполнением какой-либо операции с данными или возвратом какой-либо из них пользователю.Если бы мне пришлось подключиться к странице, найти первый HTML-элемент таблицы строк, проверить дочерние элементы на наличие текста, содержащего подстроку, я мог бы потенциально вернуть информацию конечному пользователю Android быстрее и с меньшими затратами на загрузку всего документа.,Я не был уверен, какие методы jsoup дадут что-то для этого.
Я очень плохо знаком с jsoup и java и несколько менее нов (но все еще учусь) в других языках, таких как C и C #.Правильное форматирование вставленного текста оставляло желать лучшего, и я не смог успешно использовать тег prettify при просмотре в Chrome и заранее извинялся, если пропустил ввод символа или конечного блока при копировании и вставке теста.Еще раз спасибо
Jsoupx1.Activity.java
package jsoup.example1;
import java.io.IOException;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.view.View;
public class Jsoupx1Activity extends ListActivity {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
//ArrayList tableRowStrings will be the recipient of table row data that matches a search criterion,
//stored in the form of strings.
ArrayList<String> tableRowStrings = new ArrayList<String>();
//Open a document from a valid URL using jsoup
Document doc = null;
try {
doc = Jsoup.connect("http://www.w3schools.com/html/html_tables.asp").get();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Once this document has loaded, select all <tr> tableRow elements into tableRows, with each
//tableRow, collect all children, which will be <td>, into tableDatas Elements, test that Elements class for text,
//if text exists, transfer the text of these children to a string, test that string for a substring,
//In this case, a date, if it contains this substring, add it to the created tableRowStrings ArrayList.
//This function falsely returns a string with duplicated table row information.
//Example Test Criteria, in reality this may be interfaced to a datetime or textbox widget
//to facilitate an end-user defined search
String testString = "Apples";
//select all <tr> or Table Row Elements
Elements tableRows = doc.select("tr");
//Load ArrayList with table row strings
for (Element tableRow : tableRows){
Elements tableDatas = tableRow.getAllElements();
//Test if the the TableData contains Text, if so convert that text to a string rowData
if (tableDatas.hasText()){
String rowData = tableDatas.text();
if (rowData.contains(testString)){
tableRowStrings.add(rowData);
}
}
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, tableRowStrings);
setListAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
String item = (String) getListAdapter().getItem(position);
Toast.makeText(this, item + " selected", Toast.LENGTH_LONG).show();
}
}
И сопровождающий main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="16sp" >
</TextView>
<ListView
android:id="@+android:id/list"
android:layout_width="fill_parent"
android:textColor="#444444"
android:cacheColorHint="#00000000"
android:layout_height="wrap_content"
>
</ListView>
</LinearLayout>