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.
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 –
@MikeM. Wie stellst du den Adapter auf ListView ein? – jskrwyk