#android #for-loop #android-listview #jsoup #baseadapter
#Android #для цикла #android-просмотр списка #jsoup #базовая адаптация
Вопрос:
Я анализирую 2 элемента, теги TD с веб-сайта, выполняя 2 цикла for с помощью JSoup. Я хочу, чтобы они отображались рядом друг с другом в виде списка, например:
naam: waarde
naam: waarde
Но они отображаются следующим образом в Listview, который заполняется с помощью Customb BaseAdapter .
naam:
naam:
naam:
waarde
waarde
waarde
Может кто-нибудь, пожалуйста, помочь мне сделать это? Это заставляет меня некоторое время быть занятым.
Любые другие предложения также приветствуются, спасибо.
2 для циклов, которыми заполняются списки «naam» и «waarde»:
Document doc = Jsoup.parse(kpn);
Elements tdsFromSecondColumn = doc.select("table.personaltable td:eq(0)");
Elements tdsFromSecondColumn1 = doc.select("table.personaltable td:eq(1)");
SearchResults sr1 = new SearchResults();
for (Element tdFromSecondColumn : tdsFromSecondColumn) {
sr1 = new SearchResults();
sr1.setNaam(tdFromSecondColumn.text());
results.add(sr1);
}
for (Element tdFromSecondColumn1 : tdsFromSecondColumn1) {
sr1 = new SearchResults();
sr1.setWaarde(tdFromSecondColumn1.text());
results.add(sr1);
}
Я знаю, что это должно быть что-то вроде этого, но как?:
for (Element tdFromSecondColumn : tdsFromSecondColumn) {
sr1 = new SearchResults();
sr1.setNaam(tdFromSecondColumn.text());
sr1.setWaarde(tdFromSecondColumn1.text());
results.add(sr1);
}
Вот мой пользовательский базовый адаптер:
public class MyCustomBaseAdapter extends BaseAdapter {
private static ArrayList<SearchResults> searchArrayList;
private LayoutInflater mInflater;
public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
searchArrayList = results;
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return searchArrayList.size();
}
public Object getItem(int position) {
return searchArrayList.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.test, null);
holder = new ViewHolder();
holder.txtNaam = (TextView) convertView.findViewById(R.id.naam);
holder.txtWaarde = (TextView) convertView.findViewById(R.id.waarde);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.txtNaam.setText(searchArrayList.get(position).getNaam());
holder.txtWaarde.setText(searchArrayList.get(position).getWaarde());
return convertView;
}
static class ViewHolder {
TextView txtNaam;
TextView txtWaarde;
}
}
Редактировать:
Теперь у меня что-то вроде этого, но я получаю исключение indexsize 12:
public ArrayList<SearchResults> GetSearchResults(){
ArrayList<SearchResults> results = new ArrayList<SearchResults>();
ArrayList<SearchResults> results1 = new ArrayList<SearchResults>();
ArrayList<SearchResults> results2 = new ArrayList<SearchResults>();
Document doc = Jsoup.parse(kpn);
Elements tdsFromSecondColumn = doc.select("table.personaltable td:eq(0)");
Elements tdsFromSecondColumn1 = doc.select("table.personaltable td:eq(1)");
SearchResults sr1 = new SearchResults();
SearchResults sr2 = new SearchResults();
for (Element tdFromSecondColumn : tdsFromSecondColumn) {
sr1 = new SearchResults();
sr1.setNaam(tdFromSecondColumn.text());
results.add(sr1);
}
for (Element tdFromSecondColumn1 : tdsFromSecondColumn1) {
sr2 = new SearchResults();
sr2.setWaarde(tdFromSecondColumn1.text());
results1.add(sr2);
}
for (int i = 0; i < results.size();i ) {
results.add(results.get(i));
results2.add(results1.get(i));
}
return results2;
}
}
Правка2:
Исключение исчезло, но оно показывает только результат 1 i.setWaarde:
public ArrayList<SearchResults> GetSearchResults(){
ArrayList<SearchResults> results = new ArrayList<SearchResults>();
ArrayList<SearchResults> results1 = new ArrayList<SearchResults>();
ArrayList<SearchResults> results2 = new ArrayList<SearchResults>();
Document doc = Jsoup.parse(kpn);
Elements tdsFromSecondColumn = doc.select("table.personaltable td:eq(0)");
Elements tdsFromSecondColumn1 = doc.select("table.personaltable td:eq(1)");
SearchResults sr1 = new SearchResults();
SearchResults sr2 = new SearchResults();
for (Element tdFromSecondColumn : tdsFromSecondColumn) {
sr1 = new SearchResults();
sr1.setNaam(tdFromSecondColumn.text());
results.add(sr1);
}
for (Element tdFromSecondColumn1 : tdsFromSecondColumn1) {
sr1 = new SearchResults();
sr1.setWaarde(tdFromSecondColumn1.text());
results1.add(sr1);
}
for (int i = 0; i < results.size() amp;amp; i < results1.size();i ) {
results.add(results.get(i));
results2.add(results1.get(i));
}
return results2;
}
}
Ответ №1:
1 к тому, что сказал Крис. Кроме того, если вы пытаетесь объединить эти два цикла, вы не сможете сделать это с таким синтаксисом. Просто используйте простой метод подсчета, например
for(Object o : oList1) {
doStuff(o);
}
for (Object o : oList2) {
doStuff2(o);
}
становится
for (int i = 0; i < oList1.size() amp;amp; i < oList2.size(); i ) {
doStuff(oList1.get(i));
doStuff2(oList2.get(i));
}
Конечно, это предполагает, что два списка имеют одинаковую длину, в противном случае один из списков не будет полностью использован. Если они различаются, вы МОЖЕТЕ использовать OR вместо AND в цикле и проверять каждый из них на наличие null, прежде чем действовать с ним, но вам, вероятно, лучше просто использовать два отдельных цикла.
Комментарии:
1. Привет, kcoppock, хорошо, спасибо за подсказку, попробовал, см. Отредактированный код, но я получил исключение ivalid размер индекса 12.
2. Вы не пробовали то, что я показал.
results1
должно быть больше, чемresults
для вашего исключения; вы никогда не проверяете, чтобы убедиться, что ваш индекс находится в пределах границresults
.3. Хорошо, kcoppock, я признаю, что сейчас я потерян, но я все равно принимаю ваш ответ. Не могли бы вы привести пример, что именно вы имеете в виду? Я не эксперт по циклам, извиняюсь за это.
4. Вам не нужно принимать это, если ваша проблема не решена. Я привел пример того, что я имею в виду. В условии цикла я проверяю, чтобы убедиться
i
, что он меньше размера ОБОИХ списков. В ВАШЕМ примере вы проверяете только размер results1. Скажем, например, в results1 есть 5 элементов, а в results2 — 3 элемента. Цикл будет продолжаться один разi
3, потому что он меньше размера results1. Однако в results2 нет элемента с индексом 3, поскольку в списке всего 3 элемента, поэтому ваша программа вылетает.5. Хм, хорошо, исключение исчезло, пожалуйста, посмотрите мой отредактированный код. Теперь в listview отображаются только элементы setWaarde. Эта проблема с циклом не дает мне покоя уже 2 недели.
Ответ №2:
Проблема в том, что вы создаете новый SearchResults
объект каждый раз, когда проходите через каждый цикл. Можно создавать SearchResults
объект во время каждой итерации первого цикла, но вам нужно использовать SearchResults
объект, созданный в первом цикле, для второго цикла, не создавайте новый.
Комментарии:
1. Привет, Крис, Спасибо за ответ, не могли бы вы показать мне, как это сделать с моим кодом в циклах for? Я уже пробовал несколько комбинаций, но это не
t work. I
помогло. Большое вам спасибо.
Ответ №3:
Получилось!, после того, как kcoppock посоветовал немного отступить, выпить пива и сигарет, решение оказалось проще, чем я думал:
public ArrayList<SearchResults> GetSearchResults(){
ArrayList<SearchResults> results = new ArrayList<SearchResults>();
Document doc = Jsoup.parse(kp);
// Get all td's
Elements waardes= doc.select("td");
// Iterator over those elements
ListIterator<Element> postIt = waardes.listIterator();
SearchResults sr1 = new SearchResults();
while (postIt.hasNext()) {
sr1 = new SearchResults();
// Add the value text to the ArrayList
sr1.setNaam(postIt.next().text());
sr1.setWaarde(postIt.next().text());
results.add(sr1);
}
return results;
}
}