2017-02-19 13 views
0

ウェブサイトにアップロードされたXMLからデータを取得しています。 XMLのテキストをカスタムListViewに表示すると、2つのTextViewがあります。 'title'はTextViewに、 'guid'はTextViewに移動します。私はこれをどうやってやるべきかわからない。私は次のカスタムアダプタを書いた。XMLからカスタムアダプタリストへのデータの解析

私は現在、通常のArrayAdapter sの別々のListView秒で別々に2を表示することができるよCustomAdapter.java

public class CustomAdapter extends BaseAdapter { 

    private ArrayList list; 
    private LayoutInflater layoutInflater; 

    public CustomAdapter(Context context, ArrayList list) { 
     this.list= list; 
     layoutInflater = LayoutInflater.from(context); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return list.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 
     if (convertView == null) { 

      convertView = layoutInflater.inflate(R.layout.layout_list_row, null); 

      holder = new ViewHolder(); 
      holder.backgroundImage = (ImageView) convertView.findViewById(R.id.backgroundImage); 
      holder.topText = (TextView) convertView.findViewById(R.id.topText); 
      holder.bottomText = (TextView) convertView.findViewById(R.id.bottomText); 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     DiscourseItem discourseItem = (DiscourseItem) discourseList.get(position); 
     holder.topText.setText(discourseItem.getTopText()); 
     holder.bottomText.setText(discourseItem.getBottomText()); 

     return convertView; 
    } 

    static class ViewHolder { 
     ImageView backgroundImage; 
     TextView topText; //This should display the text in the 'title' field 
     TextView bottomText; //This should display the text in the 'guid' field 
    } 

} 

。ここに私が書いたコードがあります。

XMLParser.java

public class XMLParser extends AsyncTask { 

    private URL url; 
    public ArrayList<String> title = new ArrayList<>(); 
    public ArrayList<String> guid = new ArrayList<>(); 

    @Override 
    protected Object doInBackground(Object[] objects) { 
     try { 
      url = new URL(removed); 

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

      xpp.setInput(getInputStream(url), null); 

      boolean insideItem = false; 

      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) 
          title.add(xpp.nextText()); 
        } else if (xpp.getName().equalsIgnoreCase("guid")){ 
         if (insideItem) 
          guid.add(xpp.nextText()); 
        } 
       } else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){ 
        insideItem = false; 
       } 
       eventType = xpp.next(); 
      } 
     } catch (MalformedURLException e){ 
      e.printStackTrace(); 
     } catch (XmlPullParserException e){ 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return title; 
    } 

    public InputStream getInputStream(URL url){ 
     try { 
      return url.openConnection().getInputStream(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public ArrayList<String> titles(){ 
     return title; 
    } 

    public ArrayList<String> guids(){ 
     return guid; 
    } 
} 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     parser = new XMLParser(); 
     parser.execute(); 
     title = parser.titles(); 
     guid = parser.guids(); 

     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       discourseList = getDiscourseList(); 
      } 
      }, 2000); 
     } 
     }); 

     ListView listView = (ListView) findViewById(R.id.discourseList); 
     listView.setAdapter(new CustomAdapter(this, discourseList)); 
    } 

    private ArrayList<DiscourseItem> getDiscourseList() { 
     ArrayList<DiscourseItem> listData = new ArrayList<DiscourseItem>(); 
     String[] topText = new String[title.size()]; 
     topText = title.toArray(topText); 

     String[] bottomText = new String[guid.size()]; 
     bottomText = guid.toArray(bottomText); 

     for (int i = 0; i <= title.size(); i++) { 
      try { 
       DiscourseItem discourseItem = new DiscourseItem(); 
       discourseItem.setTopText(topText[i]); 
       discourseItem.setBottomText(bottomText[i]); 
       listData.add(discourseItem); 
      } catch (ArrayIndexOutOfBoundsException e){ 
       e.printStackTrace(); 
      } 
     } 
     return listData; 
    } 
} 

編集:

私は上記の変更を加えました。 getDiscourseList()を呼び出したときに、パーサが実行され、今、それがdiscourseItem.setTopText(topText[i]);で次のエラーがスローされます。

java.lang.ArrayIndexOutOfBoundsException: length=2; index=2 

答えて

1

あなたが私にはわからないよう別の名前を検討し、(自分の上下値のため、このような何かをラッパークラスを作成することができますあなたのデータのコンテキスト):その後、

public class TitleGuidPair { 
    private final String title; 
    private final String guid; 
    public TitleGuidPair(String title, String guid) { 
    this.title = title; 
    this.guid = guid; 
    } 
//getters 
} 

そしてTitleGuidPairのArrayListにあなたの結果を解析します。解析アルゴリズムを維持したい場合は、後処理を行い、後で2つのリストからTitleGuidPairを構築することができます。

はちょうどTitleGuidPairsのアダプタリストに渡すの背後にあるとGetViewメソッドでそのステップは、表示するために1 `ListView`を利用するために

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 
    if (convertView == null) { 

     convertView = layoutInflater.inflate(R.layout.layout_list_row, null); 

     holder = new ViewHolder(); 
     holder.backgroundImage = (ImageView) convertView.findViewById(R.id.backgroundImage); 
     holder.topText = (TextView) convertView.findViewById(R.id.topText); 
     holder.bottomText = (TextView) convertView.findViewById(R.id.bottomText); 
     TitleGuidPair titleGuidPair = list.get(position); 
     holder.topText.setText(titleGuidPair.getTitle()); 
     holder.bottomText.setText(titleGuidPair.getGuid()); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    return convertView; 
} 
+0

ようなので、私が行った変更を上部と下部のテキストを設定しましたそのデータは 'ArrayIndexOutOfBoundsException'をスローします。コードとエラーを反映するようにOPを更新しました。 – Devansh

+0

配列のサイズはtitle.size()であると宣言します。したがって、0からsize -1までのインデックスにアクセスできます。ループでは、0からsizeまでのインデックスを点滅させます。ループをfor(int i = 0; i <= title.size(); i ++)からfor(int i = 0; i Bari

+0

ねえ、ありがとう。ちょうど私がここにこれを掲示した直後に、私は再び自分のコードを見て、これに気づいた。そして、はい、すべてのタイトルのためのGUIDがありますので問題にはなりません。どうもありがとう! – Devansh

関連する問題