2016-04-07 6 views
0

Ich versuche, diese Bibliothek https://github.com/ShirwaM/Simplistic-RSS zu implementieren.Pass ListView und ArrayAdpater zu einer anderen Klasse

Die Bibliothek funktioniert wie beschrieben, aber ich mag nicht, wie die Feed-Ausgabe behandelt wird. Im Wesentlichen in einer privaten Klasse in der Hauptaktivität ruft es direkt den ListView und den ArrayAdapter auf. Das heißt, wenn zwei ListViews zwei Feeds anzeigen sollen, muss ich die gesamte private Klasse duplizieren. Ich möchte, dass ein ArrayAdapater akzeptiert wird und ListView an ihn übergeben wird, damit ich diese Klasse ausschalten kann und sie dann einfach zweimal aufrufen kann, wobei die relevante Feed-URL und ListView für die Ausgabe übergeben werden.

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 


public class MainActivity extends Activity 
{ 
    private ListView mList; 
    private ListView lList; 
    ArrayAdapter<String> adapter; 
    ArrayAdapter<String> adapterSecond; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.rss_layout); 

     lList = (ListView) findViewById(R.id.listTwo); 
     mList = (ListView) findViewById(R.id.listOne); 

     adapterSecond = new ArrayAdapter<String>(this, R.layout.basic_list_item); 
     adapter = new ArrayAdapter<String>(this, R.layout.basic_list_item); 
     new GetRssFeed().execute("http://feeds.arstechnica.com/arstechnica/index"); 
     new GetRssFeedSecond().execute("http://feeds.skynews.com/feeds/rss/home.xml"); 
    } 

    private class GetRssFeed extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) 
     { 
      try 
      { 
       RssReader rssReader = new RssReader(params[0]); 
       Integer i = 0; 
       for (RssItem item : rssReader.getItems()) 
       { 
        adapter.add(item.getTitle()); 
        i++; 
        if(i == 7) 
        { 
         break; 
        } 
       } 

      } catch (Exception e) 
      { 
       Log.v("Error Parsing Data", e + ""); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      super.onPostExecute(aVoid); 
      adapter.notifyDataSetChanged(); 
      mList.setAdapter(adapter); 
     } 
    } 

    private class GetRssFeedSecond extends AsyncTask<String, Void, Void> 
    { 
     @Override 
     protected Void doInBackground(String... params) 
     { 
      try 
      { 
       RssReader rssReader = new RssReader(params[0]); 
       Integer i = 0; 
       for (RssItem item : rssReader.getItems()) { 
        adapter.add(item.getTitle()); 
        i++; 
        if (i == 7) { 
         break; 
        } 

       } 
      } catch (Exception e) 
      { 
       Log.v("Error Parsing Data", e + ""); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) 
     { 
      super.onPostExecute(aVoid); 
      adapterSecond.notifyDataSetChanged(); 
      lList.setAdapter(adapterSecond); 
     } 
    } 

} 

Wie Sie sehen können, weil GetRssFeed mit dem Adapter und Listview fest codierten ist, gemäß dem Simpel-RSS Beispielcode, ich brauche zwei GetRssFeed Klassen erstellen zwei verschiedene Listviews zu erzeugen. Ich möchte es so machen, dass ich eine GetRssFeed habe, die ich nur anrufen kann, wenn der relevante Adapter und ListView an sie übergeben wird.

+0

konnte Sie Verwenden Sie einen Schnittstellen-Callback in der AsyncTask, wenn die Daten zurückgegeben werden, um sie an die Aktivität zurückzugeben. Das Festhalten von Ansichten in einer AsyncTask hat Nachteile –

+0

@MikeM. Wie stellst du den Adapter auf ListView ein? – jskrwyk

Antwort

1

Innerhalb GetRssFeed Klasse, fügen Sie einen Konstruktor, der 2 Parameter akzeptiert, URL und Listview, wenn Sie den Adapter ändern möchten, dann fügen Sie 3 Parameter, wie unten.

public GetRssFeed(String feedUrl, ListView listView) { 
    this.feedUrl = feedUrl; 
    this.listView = listView; 

} 

Definieren Sie diese 2 Variablen innerhalb der GetRssFeed-Klasse als Instanzvariablen und verwenden Sie sie.

dann von der onCreate, rufen Sie wie unten,

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", listView).execute(); 

Ihr Einzel AsyncTask wie folgt aussehen,

private class GetRssFeed extends AsyncTask<String, Void, Void> 
{ 
    ListView listView; 
    String url; 
    ArrayAdapter adapter; 

    public GetRssFeed(String url, ListView listView, ArrayAdapter adapter) { 
     this.listView = listView; 
     this.url = url; 
     this.adapter = adapter; 
    } 
    @Override 
    protected Void doInBackground(String... params) 
    { 
     try 
     { 

      Log.d("tag", "nayana url "+url); 
      RssReader rssReader = new RssReader(params[0]); 
      Integer i = 0; 
      for (RssItem item : rssReader.getItems()) 
      { 
       adapter.add(item.getTitle()); 
       i++; 
       if(i == 7) 
       { 
        break; 
       } 
      } 

     } catch (Exception e) 
     { 
      Log.v("Error Parsing Data", e + ""); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) 
    { 
     super.onPostExecute(aVoid); 
     adapter.notifyDataSetChanged(); 
     mList.setAdapter(adapter); 
    } 
} 

Von onCreate, rufen Sie

new GetRssFeed("http://feeds.arstechnica.com/arstechnica/index", lList, ADAPTER).execute(); 
    new GetRssFeed("http://feeds.skynews.com/feeds/rss/home.xml", mList, adapterSECOND).execute(); 
+0

Ich habe versucht, es so zu formatieren, aber weil es eine Klasse ist, erweitert die ASyncTask es Format nicht mag. Es gibt einen Fehler, der sagt 'Klasse oder Schnittstelle erwartet' – jskrwyk

+0

sorry, ich habe versucht und es funktioniert gut .. Ich werde meine Antwort bearbeiten warten, –

+1

@JamesKrawczyk, hinzufügen Konstruktor in AsyncTask funktioniert gut. Bitte überprüfen Sie meine bearbeitete Antwort –