2014-12-09 1 views
0

저는 Android 개발을 처음 접했고 한 번에 두 개 이상의 태그를 구문 분석하여 ListView에 표시하려고 애 쓰고 있습니다.TITLE 태그 만 구문 분석 할 수 있습니다 - 링크, 설명, PUBDATE 및 기타 구문 분석하지 않습니다. (RSS/SAX)

SAX 파서를 사용하고 있습니다. 내 RssParseHandler 코드입니다.

public class ReaderAppActivity extends Fragment { 

    private ReaderAppActivity local; 
    private ListView mList; 
    /** 
    * This method creates main application view 
    */ 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     //super.onCreate(savedInstanceState); 
     // Set view 
     //setContentView(R.layout.fragment_rss); 





     local = this; 
     //int position = getArguments().getInt("position"); 

     // String url = getArguments().getString("url"); 

     // List of rivers 
     String[] menus = getResources().getStringArray(R.array.menus); 

     // Creating view corresponding to the fragment 
     View v = inflater.inflate(R.layout.fragment_rss, container, false); 
     // Set reference to this activity 
     //local = this; 

     GetRSSDataTask task = new GetRSSDataTask(); 

     // Start download RSS task 
     task.execute("http://thechurchofwhatshappeningnow.libsyn.com/rss"); 
     //task.execute(url); 

     // Debug the thread name 
     Log.d("ITCRssReader", Thread.currentThread().getName()); 

     //mList = (ListView) findViewById(R.id.rssListMainView); 

     return v; 
    } 

    private class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem> > { 
     @Override 
     protected List<RssItem> doInBackground(String... urls) { 

      // Debug the task thread name 
      Log.d("ITCRssReader", Thread.currentThread().getName()); 

      try { 
       // Create RSS reader 
       RssReader rssReader = new RssReader(urls[0]); 

       // Parse RSS, get items 
       return rssReader.getItems(); 

      } catch (Exception e) { 
       Log.e("ITCRssReader", e.getMessage()); 
      } 


      return null; 
     } 

     @Override 
     protected void onPostExecute(List<RssItem> result) { 

      // Get a ListView from main view 
      ListView mList = (ListView) getView().findViewById(R.id.rssListMainView); 

      // Create a list adapter 
      ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.rss_text, result); 
      //ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.fragment_rss, result); 
      // Set list adapter for the ListView 
      mList.setAdapter(adapter); 

      // Set list view item click listener 
      mList.setOnItemClickListener(new ListListener(result, getActivity())); 




     } 
    } 
} 

내가 잘못 뭐하는 거지 : 여기

public class RssParseHandler extends DefaultHandler { 
private List<RssItem> rssItems; 
private RssItem currentMessage; 
//private StringBuilder builder; 
private boolean parseLink; 
private boolean parseTitle; 
private boolean parseDate; 
private boolean parseDes; 

public RssParseHandler() { 
    rssItems = new ArrayList(); 
} 

public List<RssItem> getItems() { 


    return this.rssItems; 
} 


@Override 
public void startElement(String uri, String localName, String name, 
         Attributes attributes) throws SAXException { 
    super.startElement(uri, localName, name, attributes); 
    if (localName.equalsIgnoreCase("item")) { 
     this.currentMessage = new RssItem(); 
    } else if (localName.equalsIgnoreCase("title")) { 
     //currentMessage.setTitle(builder.toString()); 
     parseTitle = true; 
    } else if (localName.equalsIgnoreCase("link")) { 
     //currentMessage.setLink(builder.toString()); 
     parseLink = true; 
    } else if (localName.equalsIgnoreCase("description")) { 
     //currentMessage.setDescription(builder.toString()); 
     parseDes = true; 
     } else if (localName.equalsIgnoreCase("pubDate")) { 
     //currentMessage.setDate(builder.toString()); 

     parseDate = true; 
    } 

    //parsing enclosure tag 
    else if ("enclosure".equals(localName)) { 
     // Get tags attributes number 
     int attrsLength = attributes.getLength(); 
     for (int i = 0; i < attrsLength; i++) { 
      String attrName = attributes.getQName(i); // attribute name 
      if ("url".equals(attrName)) // This tag has only one attribute but it is better to check it name is correct 
       currentMessage.getLink(); 

     } 

    } 
} 


@Override 
public void endElement(String uri, String localName, String name) 
     throws SAXException { 


    super.endElement(uri, localName, name); 
    if (this.currentMessage != null) { 
     if (localName.equalsIgnoreCase("item")) { 
      rssItems.add(currentMessage); 
      //currentMessage = null; 
     } else if (localName.equalsIgnoreCase("link")) { 
      //currentMessage.setLink(builder.toString()); 
      //parseLink = false; 
     } else if (localName.equalsIgnoreCase("description")) { 
      //currentMessage.setDescription(builder.toString()); 
      //parseDes = false; 
     } else if (localName.equalsIgnoreCase("pubDate")){ 

      //currentMessage.setDate(builder.toString()); 
      parseDate = false; 
     } else if (localName.equalsIgnoreCase("title")) { 
      //currentMessage.setTitle(builder.toString()); 
      parseTitle = false; 
     } 
     //builder.setLength(0); 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) 
     throws SAXException { 
    super.characters(ch, start, length); 
    //builder.append(ch, start, length); 
    if (parseTitle) { 
     if (currentMessage != null) 
      currentMessage.setTitle(new String(ch, start, length)); 

    } else if (parseLink) { 
     if (currentMessage != null) { 
      currentMessage.setLink(new String(ch, start, length)); 
      //parseLink = false; 
     } 
    } else if (parseDes) { 
     if (currentMessage != null) 
      currentMessage.setDescription(new String(ch, start, length)); 
      //parseLink = false; 


    } else if (parseDate) { 
     if (currentMessage != null) { 
      currentMessage.setDate(new String(ch, start, length)); 
      //currentMessage.setDate(new String(ch, start, length)); 
      //parseDesc = false; 
     } 
     } 
    } 

} 

리스트 뷰에 대한 코드? 나는 그것을 이해할 수 없다. 나는 링크, 설명, pubDate를 파싱하고 ListView에 전달하려고합니다. 이상적으로는 listview에 제목과 에피소드 번호 만 표시하고 다른 태그는 String으로 전달하므로 listView에서 항목을 클릭하면이를 표시 할 수 있습니다.

ListView에서 항목을 클릭 할 때 호출되는 SingleMenuItem이라는 또 다른 클래스를 만들었습니다. 필자가 지금 필자는 항목을 파싱하지 않았기 때문에 아무것도 표시하지 않습니다.

도움을 주시면 감사하겠습니다. 당신의 RssParseHandler

public class ReaderAppActivity extends Fragment { 

private ReaderAppActivity local; 
private ListView mList; 
/** 
* This method creates main application view 
*/ 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    //super.onCreate(savedInstanceState); 
    // Set view 
    //setContentView(R.layout.fragment_rss); 





    local = this; 
    //int position = getArguments().getInt("position"); 

    // String url = getArguments().getString("url"); 

    // List of rivers 
    String[] menus = getResources().getStringArray(R.array.menus); 

    // Creating view corresponding to the fragment 
    View v = inflater.inflate(R.layout.fragment_rss, container, false); 
    // Set reference to this activity 
    //local = this; 

    GetRSSDataTask task = new GetRSSDataTask(); 

    // Start download RSS task 
    task.execute("http://thechurchofwhatshappeningnow.libsyn.com/rss"); 
    //task.execute(url); 

    // Debug the thread name 
    Log.d("ITCRssReader", Thread.currentThread().getName()); 

    //mList = (ListView) findViewById(R.id.rssListMainView); 

    return v; 
} 

private class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem> > { 
    @Override 
    protected List<RssItem> doInBackground(String... urls) { 

     // Debug the task thread name 
     Log.d("ITCRssReader", Thread.currentThread().getName()); 

     try { 
      // Create RSS reader 
      RssReader rssReader = new RssReader(urls[0]); 

      // Parse RSS, get items 
      return rssReader.getItems(); 

     } catch (Exception e) { 
      Log.e("ITCRssReader", e.getMessage()); 
     } 


     return null; 
    } 

    @Override 
    protected void onPostExecute(List<RssItem> result) { 

     // Get a ListView from main view 
     ListView mList = (ListView) getView().findViewById(R.id.rssListMainView); 

     // Create a list adapter 
     ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.rss_text, result); 
     //ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem>(getActivity(),R.layout.fragment_rss, result); 
     // Set list adapter for the ListView 
     mList.setAdapter(adapter); 

     // Set list view item click listener 
     mList.setOnItemClickListener(new ListListener(result, getActivity())); 




    } 
} 

}

답변

0

주석 처리 된 코드의 양을 바탕으로 다음과 같습니다

public class SingleMenuItem extends Activity { 

    // XML node keys 
    static final String KEY_NAME = "name"; 
    static final String KEY_DATE = "pubdate"; 
    static final String KEY_DESC = "description"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.single_list_item); 

     // getting intent data 
     Intent in = getIntent(); 

     // Get XML values from previous intent 
     String name = in.getStringExtra(KEY_NAME); 
     String date = in.getStringExtra(KEY_DATE); 
     String description = in.getStringExtra(KEY_DESC); 

     // Displaying all values on the screen 
     TextView lblName = (TextView) findViewById(R.id.name_label); 
     TextView lblDate = (TextView) findViewById(R.id.date_label); 
     TextView lblDesc = (TextView) findViewById(R.id.description_label); 

     lblName.setText(name); 
     lblDate.setText(date); 
     lblDesc.setText(description); 
    } 
} 

Here is a RSS link to the feed:은 ListView에로 구문 분석의 결과를두고 내 ReaderAppActivty 코드입니다 , 당신은 분명히 이것으로 조금 어려움을 겪어 왔고, 어떤 초기 시도는 당신이 지금 가지고있는 것보다 더 가깝습니다.

현재 코드의 문제는 설정중인 항목의 어느 부분을 구동하는 불리언 값을 지속적으로 재설정하지 않는 것 같습니다. 디버깅을 통해 링크 필드에 날짜를 설정하는 것을 보았습니다.

그러나 실제로는 잘못된 방법으로 설정 중 일부를 수행하고 있습니다. characters 메서드가 반드시 태그의 전체 내용을 제공하지는 않습니다. Stringbuilder을 사용해야하며 주석 처리 된 코드에서 어느 시점에서 시도했는지 확인할 수 있습니다.

문자열 작성기에서 텍스트를 수집하고 endElement 메서드에서 모든 설정을 수행하는 경우 endElement 메서드에서 끝나는 태그를 알고 있기 때문에 절대 불린이 필요하지 않습니다.

당신이 어떤 시점에서 가지고 있었던 것과 너무 거리가 멀지 만 모든 플래그 필드를 없애는 작동 버전이 있습니다.

public class RssParseHandler extends DefaultHandler { 
    private List<RssItem> rssItems; 
    private RssItem currentMessage; 
    private StringBuilder builder; 

    public RssParseHandler() { 
     rssItems = new ArrayList<>(); 
     builder = new StringBuilder(); 
    } 

    public List<RssItem> getItems() { 
     return this.rssItems; 
    } 

    @Override 
    public void startElement(String uri, String localName, String name, 
          Attributes attributes) throws SAXException { 
     super.startElement(uri, localName, name, attributes); 
     builder.setLength(0); 
     if (localName.equalsIgnoreCase("item")) { 
      this.currentMessage = new RssItem(); 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String name) 
      throws SAXException { 

     super.endElement(uri, localName, name); 
     if (this.currentMessage != null) { 
      if (localName.equalsIgnoreCase("item")) { 
       rssItems.add(currentMessage); 
       currentMessage = null; 
      } else if (localName.equalsIgnoreCase("link")) { 
       currentMessage.setLink(builder.toString()); 
      } else if (localName.equalsIgnoreCase("description")) { 
       currentMessage.setDescription(builder.toString()); 
      } else if (localName.equalsIgnoreCase("pubDate")){ 
       currentMessage.setDate(builder.toString()); 
      } else if (localName.equalsIgnoreCase("title")) { 
       currentMessage.setTitle(builder.toString()); 
      } 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     super.characters(ch, start, length); 
     builder.append(ch, start, length); 
    } 

} 
관련 문제