Android Studio несколько RSS в одном RecyclelerView - PullRequest
0 голосов
/ 04 октября 2018

Я застрял здесь с чем-то.Я хочу создать приложение, которое будет читать из нескольких 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());
}
}

Итак, мой вопрос:

  1. Как объединить результаты rss (я знаю, что наценки могут быть разными для одного rss к другому)?Мне нужно использовать другой анализатор, кроме DOM?
  2. Я стараюсь поддерживать его как можно более динамичным, поэтому, если я добавлю новый URL-адрес с помощью urls.add, у меня будет новый контент, который я хочу отсортировать по остальным по дате,Вот почему мне нужен один источник для моего RecyclerView.
  3. Больше запроса, чем вопроса, но, если возможно, я не хочу создавать адаптер для RSS-канала (по очевидным динамическим причинам):).

Не могли бы вы просто дать мне подсказку о том, что я ищу?

Большое спасибо за вашу помощь;).

L.

...