2015-05-27 2 views
0

У меня есть читатель новостей (с использованием rss), это тоже работает, теперь я пытаюсь открыть навигатор после нажатия на новости, но я не знаю, как получить ссылка (я просто знаю, что я должен использовать getLink(), но я не знаю где):Open Navigator после нажатия на Rss Reader

Actualites.java

public class Actualites extends android.support.v4.app.Fragment{ 
    AsyncTask<Void, Void, List> a = null; 
    NewsAdapter adapter = null; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     View view = inflater.inflate(R.layout.activity_actualites, container, false); 
     ListView list = (ListView) view.findViewById(R.id.listView1); 
     adapter = new NewsAdapter(getActivity(), new ArrayList<News>()); 
     list.setAdapter(adapter); 
     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("http://www.solutis.fr"))); 
      } 
     }); 
     a = new AsyncTask<Void, Void, List>() { 
      @Override 
      protected List doInBackground(Void... params) { 
       ArrayList<News> res = new ArrayList<News>(); 
       try { 
        URL url = new URL("http://www.solutis.fr/actualites-rachat-credit,rss.html?format=feed"); 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
        RssParser parser = new RssParser(); 
        try { 
         return parser.parse(urlConnection.getInputStream()); 
        } catch (XmlPullParserException e) { 
         e.printStackTrace(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       return res; 
      } 

      @Override 
      protected void onPostExecute(List result) { 
       adapter.update(result); 
      } 
     }; 
     a.execute(); 
     TextView textView =(TextView)getActivity().findViewById(R.id.main_toolbar_title); 
     textView.setText(getString(R.string.title_actu)); 
     textView.setTypeface(Typeface.createFromAsset(getActivity().getAssets(), "fonts/GothamBook.ttf")); 
     return view; 
    } 
} 

NewsAdapter.java

public class NewsAdapter extends BaseAdapter { 
    List<News> news; 
    Context context; 

    public NewsAdapter(Context context, List<News> news) { 
     this.news = news; 
     this.context = context; 
    } 

    public void update(List<News> news) { 
     this.news = news; 
     notifyDataSetChanged(); 
    } 

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

    @Override 
    public Object getItem(int arg0) { 
     return news.get(arg0); 
    } 

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

    @Override 
    public View getView(int arg0, View arg1, ViewGroup arg2) { 
     LayoutInflater li = LayoutInflater.from(context); 
     View v = li.inflate(R.layout.three_line_list_item, null); 
     TextView tv1 = (TextView)v.findViewById(android.R.id.text1); 
     tv1.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/GothamBold.ttf")); 
     tv1.setTextSize(15); 
     TextView tv3 = (TextView)v.findViewById(android.R.id.title); 
     tv3.setTextColor(Color.parseColor("#2B729F")); 
     tv3.setTextSize(13); 
     tv3.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/GothamBook.ttf")); 
     TextView tv2 = (TextView)v.findViewById(android.R.id.text2); 
     tv2.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/GothamBook.ttf")); 
     tv2.setTextSize(14); 
     News n = (News)getItem(arg0); 
     tv1.setText(n.getTitle()); 
     String pubDate = Html.fromHtml(n.getPubDate()).toString().replace((char) 65532, (char) 32).trim(); 
     tv3.setText(pubDate); 
     String content = Html.fromHtml(n.getContent()).toString().replace((char) 65532, (char) 32).trim(); 
     tv2.setText(content); 
     return v; 
    } 
} 

RssParser.java

public class RssParser { 
    private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { 
     String result = ""; 
     if (parser.next() == XmlPullParser.TEXT) { 
      result = parser.getText(); 
      parser.nextTag(); 
     } 
     return result; 
    } 
    private static final String ns = null; 

    private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      throw new IllegalStateException(); 
     } 
     int depth = 1; 
     while (depth != 0) { 
      switch (parser.next()) { 
       case XmlPullParser.END_TAG: 
        depth--; 
        break; 
       case XmlPullParser.START_TAG: 
        depth++; 
        break; 
      } 
     } 
    } 

    public ArrayList<News> parse(InputStream in) throws XmlPullParserException, IOException { 
     XmlPullParser parser = Xml.newPullParser(); 
     parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 
     parser.setInput(in, null); 
     parser.nextTag(); 
     ArrayList<News> entries = new ArrayList<News>(); 

     parser.require(XmlPullParser.START_TAG, ns, "rss"); 
     parser.nextTag(); 
     parser.require(XmlPullParser.START_TAG, ns, "channel"); 
     while (parser.next() != XmlPullParser.END_TAG) { 
      if (parser.getEventType() != XmlPullParser.START_TAG) { 
       continue; 
      } 
      String name = parser.getName(); 
      if (name.equals("item")) { 
       String title = ""; 
       String link = ""; 
       String pubDate = ""; 
       String content = ""; 
       while (parser.next() != XmlPullParser.END_TAG) { 
        if (parser.getEventType() != XmlPullParser.START_TAG) { 
         continue; 
        } 
        name = parser.getName(); 
        if (name.equals("title")) { 
         title = readText(parser); 
        } else if (name.equals("link")) { 
         link = readText(parser); 
        } else if (name.equals("pubDate")) { 
         pubDate = readText(parser); 
        } else if (name.equals("description")) { 
         content = readText(parser); 
        } else 
         skip(parser); 
       } 
       entries.add(new News(title, pubDate, content)); 
      } else 
       skip(parser); 
     } 
     return entries; 
    } 
} 

News.java

public class News { 
    private String title; 
    private String content; 
    private String pubDate; 
    private String link; 

    public News(String title, String pubDate, String content) { 
     this.title = title; 
     this.content = content; 
     this.pubDate = pubDate; 
    } 

    public News(String link, String title, String pubDate, String content) { 
     this.link = link; 
     this.title = title; 
     this.content = content; 
     this.pubDate = pubDate; 
    } 

    public String getTitle() { 
     return (title); 
    } 

    public String getContent() { 
     return (content); 
    } 

    public String getPubDate(){ 
     return (pubDate); 
    } 

    public String getLink(){ 
     return (link); 
    } 
} 

Я должен изменить общественное недействительным onItemClick(), я только положить URL, но я должен получить URL новостей, но я не знаете, как это сделать. Кто-то может мне помочь?

ответ

0

Вы можете получить объект новостей из адаптера, используя параметр позиции в onItemClick. Я не тестировал код, но это будет примерно следующее:

@Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       News news = (News) adapter.getItem(position) 
       startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(news.getLink()))); 
      } 
+0

Я получаю сообщение об ошибке: к неустранимым: главный java.lang.NullPointerException: uriString в android.net.Uri $ StringUri. (Uri.java:464) на android.net.Uri $ StringUri. (Uri.java:454) в android.net.Uri.parse (Uri.java:426) в package.Actualites $ 1.onItemClick (Actualites.java:37) Я думаю, что его из-за его не строку – benjyspider

+0

Просто заметили, что в вашем RSSParser вы вызываете entries.add (новые новости (название, pubDate, content)); Вам нужно вызвать версию, которая принимает ссылку и передать ее через. Я предлагаю вам поставить точку останова на onItemClick и проверить возвращаемый новостной объект. – CodeChimp

+0

В RSSParser я не вызываю ссылку в записи, потому что я не хочу отображать ссылку на просмотр. Версия, принимающая ссылку? Я поставил точку останова, у меня хорошая позиция в новостях, но когда я помещаю курсор в getLink(), я ничего не вижу. – benjyspider