Я застрял здесь с чем-то.Я хочу создать приложение, которое будет читать из нескольких RSS-каналов, связанных с ИТ.Таким образом, мне удается запустить несколько асинхронных задач с несколькими URL-адресами, но мой адаптер показывает только последний.Взгляните:
В моем MainActivity у меня есть этот код:
try {
Log.i("Info", "onCreate: Start task");
ArrayList<String> urls = new ArrayList<String>();
urls.add("https://www.extralife.fr/tag/pc/rss/");
urls.add("https://www.lemonde.fr/jeux-video/rss_full.xml");
urls.add("http://www.lesoir.be/rss/16/cible_principale");
urls.add("https://www.journaldugeek.com/feed/");
RSS_Async_Task[] task = new RSS_Async_Task[urls.size()];
for(int i = 0; i < urls.size(); i++)
{
Log.i("Task execution", "Work on " + urls.get(i));
try {
adapter = new News_List_Adapter();
rv.setAdapter(adapter);
task[i] = new RSS_Async_Task(adapter);
task[i].executeOnExecutor(task[i].THREAD_POOL_EXECUTOR, urls.get(i));
}
catch (Exception e)
{
Log.i("Error with task", "Error start task for url " + urls.get(i));
}
}
}
В моем адаптере:
public class News_List_Adapter extends RecyclerView.Adapter<News_List_Adapter.MyVH> implements RSS_Async_Task.DocumentConsumer{
private Document _document = null;
@Override
public void setXMLDocument(Document document) {
_document = document;
Log.i("Info", "setXMLDocument: DataSet Changed");
notifyDataSetChanged();
}
@Override
public void onBindViewHolder(MyVH holder, int position) {
Element item = (Element) _document.getElementsByTagName("item").item(position);
holder.setElement(item);
}
@Override
public int getItemCount() {
if(_document != null)
{
return _document.getElementsByTagName("item").getLength();
}
else
return 0;
}
@Override
public MyVH onCreateViewHolder(ViewGroup parent, int viewType)
{
LayoutInflater inflater= LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.news_list, parent, false);
return new MyVH(view);
}
public class MyVH extends RecyclerView.ViewHolder {
private final TextView _title;
private Element _currentElement;
public MyVH(final View itemView)
{
super(itemView);
_title = ((TextView) itemView.findViewById(R.id.title));
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new AlertDialog.Builder(itemView.getContext())
.setTitle(_title.getText())
.setMessage(_title.getText())
.show();
}
});
}
public void setElement(Element element) {
_currentElement = element;
_title.setText(element.getElementsByTagName("title").item(0).getTextContent());
}
}
}
И мой класс AsyncTask:
public class RSS_Async_Task extends AsyncTask<String, Void, Document> {
URL url;
interface DocumentConsumer {
void setXMLDocument(Document document);
}
private DocumentConsumer _consumer;
public RSS_Async_Task(DocumentConsumer consumer)
{
_consumer = consumer;
}
@Override
protected Document doInBackground(String... params) {
//HttpURLConnection connection = null;
try {
url = new URL(params[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
Log.i("Info", "doInBackground: Open Url Connection for " + url.toString());
InputStream stream = connection.getInputStream();
try {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(stream);
Log.i("INFO", "doInBackground: Document Builder " + doc.toString());
return doc;
}
finally {
stream.close();
}
} catch (Exception e) {
Log.e("Error", "doInBackground: Input Stream");
}
return null;
}
@Override
protected void onPostExecute(Document s) {
_consumer.setXMLDocument(s);
Log.i("Info", "onPostExecute: doinBG Executed for " + url.toString());
}
}
Итак, мой вопрос:
- Как объединить результаты rss (я знаю, что наценки могут быть разными для одного rss к другому)?Мне нужно использовать другой анализатор, кроме DOM?
- Я стараюсь поддерживать его как можно более динамичным, поэтому, если я добавлю новый URL-адрес с помощью urls.add, у меня будет новый контент, который я хочу отсортировать по остальным по дате,Вот почему мне нужен один источник для моего RecyclerView.
- Больше запроса, чем вопроса, но, если возможно, я не хочу создавать адаптер для RSS-канала (по очевидным динамическим причинам):).
Не могли бы вы просто дать мне подсказку о том, что я ищу?
Большое спасибо за вашу помощь;).
L.