2012-10-31 5 views
0

나는 아주 큰 문제가있다. 블로그에서 RSS 피드를 가져 와서 파싱하는 앱이 있지만 위젯에 결과를 저장하는 방법을 모르겠습니다. 여기 RSS 피드를 안드로이드 위젯에 표시하는 방법

는 자신의 활동에 올바르게 RSS 피드를 보여줍니다 RSSListActivity입니다 :

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 

     RSSItem data = itemlist.get(position); 

     Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(data.link)); 

     startActivity(intent); 
    } 

    private void retrieveRSSFeed(String urlToRssFeed,ArrayList<RSSItem> list) 
    { 
     try 
     { 
      URL url = new URL(urlToRssFeed); 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser parser = factory.newSAXParser(); 
      XMLReader xmlreader = parser.getXMLReader(); 
      RSSParser theRssHandler = new RSSParser(list); 

      xmlreader.setContentHandler(theRssHandler); 

      InputSource is = new InputSource(url.openStream()); 

      xmlreader.parse(is); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    private class RetrieveRSSFeeds extends AsyncTask<Void, Void, Void> 
    { 
     private ProgressDialog progress = null; 

     @Override 
     protected Void doInBackground(Void... params) { 
      retrieveRSSFeed("http://blog.qubiz.com/index.php/feed",itemlist); 

      rssadaptor = new RSSListAdaptor(RSSListActivity.this, R.layout.rssitemview,itemlist); 

      return null; 
     } 

     @Override 
     protected void onCancelled() { 
      super.onCancelled(); 
     } 

     @Override 
     protected void onPreExecute() { 
      progress = ProgressDialog.show(
        RSSListActivity.this, null, "Loading RSS Feed... Please wait"); 

      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      setListAdapter(rssadaptor); 

      progress.dismiss(); 

      super.onPostExecute(result); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
     } 
    } 

    private class RSSListAdaptor extends ArrayAdapter<RSSItem>{ 
     private List<RSSItem> objects = null; 

     public RSSListAdaptor(Context context, int textviewid, List<RSSItem> objects) { 
      super(context, textviewid, objects); 

      this.objects = objects; 
     } 

     @Override 
     public int getCount() { 
      return ((null != objects) ? objects.size() : 0); 
     } 

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

     @Override 
     public RSSItem getItem(int position) { 
      return ((null != objects) ? objects.get(position) : null); 
     } 

     public View getView(int position, View convertView, ViewGroup parent) { 
      View view = convertView; 

      if(null == view) 
      { 
       LayoutInflater vi = (LayoutInflater)RSSListActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       view = vi.inflate(R.layout.rssitemview, null); 
      } 

      RSSItem data = objects.get(position); 

      if(null != data) 
      { 
       TextView title = (TextView)view.findViewById(R.id.txtTitle); 
       TextView date = (TextView)view.findViewById(R.id.txtDate); 
       TextView description = (TextView)view.findViewById(R.id.txtDescription); 

       title.setText(data.title); 
       date.setText("on " + data.date); 
       String prova = android.text.Html.fromHtml(data.description).toString(); 
       //description.setText(data.description); 
       description.setText(prova); 
      } 

      return view; 
     } 
    } 

    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     menu.add(1,1,0,"About"); 
     return true; 
    } 

    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch(item.getItemId()) 
      { 
     case 1: 

      AlertDialog.Builder conferma_canc = new AlertDialog.Builder(this); 
      conferma_canc.setTitle("About"); 
      conferma_canc.setMessage("Copyright © 2012 Qubiz. All rights reserved. Android version designed and developed by Csosz Gergo Levente, Qubiz Romania."); 
      conferma_canc.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
       } 
      }); 
      AlertDialog alert = conferma_canc.create(); 
      alert.show(); 
      return true; 
      } 
     return false;   
    } 

그리고 여기 또한 정상적으로 작동 나의 RSS 파서입니다 :

public class RSSParser extends DefaultHandler { 
    private final static String TAG_ITEM = "item"; 
    private final static String[] xmltags = { "title", "link", "pubDate", "description" }; 

    private RSSItem currentitem = null; 
    private ArrayList<RSSItem> itemarray = null; 
    private int currentindex = -1; 
    private boolean isParsing = false; 
    private StringBuilder builder = new StringBuilder(); 

    public RSSParser(ArrayList<RSSItem> itemarray) { 
     super(); 

     this.itemarray = itemarray; 
    } 

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

     if(isParsing && -1 != currentindex && null != builder) 
     { 
      builder.append(ch,start,length); 
     } 
    } 

    @Override 
    public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException { 
     super.startElement(uri, localName, qName, attributes); 

     if(localName.equalsIgnoreCase(TAG_ITEM)) 
     { 
      currentitem = new RSSItem(); 
      currentindex = -1; 
      isParsing = true; 

      itemarray.add(currentitem); 
     } 
     else 
     { 
      currentindex = itemIndexFromString(localName); 

      builder = null; 

      if(-1 != currentindex) 
       builder = new StringBuilder(); 
     } 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     super.endElement(uri, localName, qName); 

     if(localName.equalsIgnoreCase(TAG_ITEM)) 
     { 
      isParsing = false; 
     } 
     else if(currentindex != -1) 
     { 
      if(isParsing) 
      { 
       switch(currentindex) 
       { 
        case 0: currentitem.title = builder.toString();   break; 
        case 1: currentitem.link = builder.toString();   break; 
        case 2: currentitem.date = builder.toString();   break; 
        case 3: currentitem.description= builder.toString(); break; 
       } 
      } 
     } 
    } 

    private int itemIndexFromString(String tagname){ 
     int itemindex = -1; 

     for(int index= 0; index<xmltags.length; ++index) 
     { 
      if(tagname.equalsIgnoreCase(xmltags[index])) 
      { 
       itemindex = index; 

       break; 
      } 
     } 

     return itemindex; 
    } 
} 

내 ExampleAppWidgetProvider.java는 RSS 피드를 보여주기 위해 바꿀 샘플 시계 위젯 코드입니다. 나에게 솔루션을 제공

public class ExampleAppWidgetProvider extends AppWidgetProvider { 
    static DateFormat df = new SimpleDateFormat("hh:mm:ss"); 
    private static final String LOG_TAG = "ExampleWidget"; 

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 
     final int N = appWidgetIds.length; 
     Log.i("ExampleWidget", "Updating widgets " + Arrays.asList(appWidgetIds)); 
     for (int i = 0; i < N; i++) { 
      int appWidgetId = appWidgetIds[i]; 
      Intent intent = new Intent(context, ExampleAppWidgetProvider.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); 

      RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget1); 
      views.setOnClickPendingIntent(R.id.button, pendingIntent); 
      views.setTextViewText(R.id.widget1label, df.format(new Date())); 

      appWidgetManager.updateAppWidget(appWidgetId, views); 
     } 
    } 

    private PendingIntent createClockTickIntent(Context context) { 
     Intent intent = new Intent(CLOCK_WIDGET_UPDATE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     return pendingIntent; 
    } 

    @Override 
    public void onEnabled(Context context) { 
     super.onEnabled(context); 
     Log.d(LOG_TAG, "Widget Provider enabled. Starting timer to update widget every second"); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 
     calendar.add(Calendar.SECOND, 1); 
     alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),1000, createClockTickIntent(context)); 
    } 

    @Override 
    public void onDisabled(Context context) { 
     super.onDisabled(context); 
     Log.d(LOG_TAG, "Widget Provider disabled. Turning off timer"); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(createClockTickIntent(context)); 
    } 

    public static String CLOCK_WIDGET_UPDATE = "com.eightbitcloud.example.widget.8BITCLOCK_WIDGET_UPDATE"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 
     Log.d(LOG_TAG, "Received intent " + intent); 
     if (CLOCK_WIDGET_UPDATE.equals(intent.getAction())) { 
      Log.d(LOG_TAG, "Clock update"); 
      ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName()); 
      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
      int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget); 
      for (int appWidgetID : ids) {updateAppWidget(context, appWidgetManager, appWidgetID); 
      } 
     } 
    } 

    public static void updateAppWidget(Context context,AppWidgetManager appWidgetManager, int appWidgetId) { 
     String currentTime = df.format(new Date()); 
     RemoteViews updateViews = new RemoteViews(context.getPackageName(),R.layout.widget1); 
     updateViews.setTextViewText(R.id.widget1label, currentTime); 
     appWidgetManager.updateAppWidget(appWidgetId, updateViews); 
    } 

} 

을 any1 수 있을까요? 내 목표는 : 위젯의 시계 Java 코드를 RSS 피드 리더로 바꾸는 것입니다. 그래서 rss 파서가 구문 분석 한 위젯에 마지막 RSS 항목을 표시하려고합니다. 어떻게해야합니까? 코드도 제공하십시오. 몇 가지 아이디어뿐만 아니라, 나는 안드로이드 개발에 다소 새로운 것입니다. 미리 도움을 주셔서 감사합니다!

답변

1

그냥 위젯에 텍스트를 변경해야 (당신은 RSS 검색 올바르게 구문 분석을 가지고 가정) :

AppWidgetManager manager = AppWidgetManager.getInstance(context); 
    RemoteViews views = new RemoteViews(context.getPackageName(), R.name_of_your_widget_layout); 
    // set text of some view 
    views.setTextViewText(R.id.widget_amount_cameras, amountCameras); 
    // and of another view 
    views.setTextViewText(R.id.widget_location, locationCity); 
    // ... and yet another view 
    views.setTextViewText(R.id.locationStatus, locationStatus); 

    // get IDs of widgets , there could be more than one 
    final int[] appWidgetIds = manager.getAppWidgetIds(new ComponentName(YOurWidgetProviderClass.class.getPackage().getName(), YOurWidgetProviderClass.class.getName())); 

    // update all hte instances 
    manager.updateAppWidget(appWidgetIds, views); 

당신은 (보안상의 제약으로) 위젯의 일부 속성을 변경할 수 있습니다 - 자바 독을 참조하십시오 자세한 설명을 보려면 RemoteViews를 참조하십시오.

+0

이 대답은 한 걸음 앞서 나갔지만 여전히 작동하지 않습니다. 어쨌든 고마워요 (Sry, 투표 할 수 없습니다, 15 명이 필요합니다) – SethPDA

+0

https://github.com/ko5tik/camerawatch/blob/master/src/de/pribluda/android/camerawatch/에서 코드를 도용 할 수 있습니다. CameraWidgetProvider.java –

+0

좋아요, 잘 했어요, 고마워요! – SethPDA

관련 문제