Объединить 2 для циклов

#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;

         }
     }