Below I present the AsyncTask , which is in the adapter. In doInBackground() , the parsing is performed using Jsoup, then the text in TextView is set to onPostExecute() .

 private class Content2 extends AsyncTask<String, Void, Boolean> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected Boolean doInBackground(String... params) { Document htmlTags = null; try { String htmlUrl = "http://www.cinemaplus.az/ru"; htmlTags = Jsoup.connect(htmlUrl).get(); } catch (Exception e) { e.printStackTrace(); } Elements moviesContainer = htmlTags.getElementsByAttributeValueContaining("class", "sortable_movie_home"); for (Element movieContainer : moviesContainer) { moviesNames.add(movieContainer.select("h2").text()); moviesUrls.add("http://www.cinemaplus.az" + movieContainer.getElementsByAttributeValueContaining("src", "site/assets").attr("src")); } return true; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); mItemText.setText(moviesNames.get(positionNext)); Picasso.get().load(moviesUrls.get(positionNext)).into(mItemImage); } } 

The adapter in which the AsyncTask is located:

 public class PopularAdapter extends RecyclerView.Adapter { private ArrayList<String> moviesNames = new ArrayList<>(); private ArrayList<String> moviesUrls = new ArrayList<>(); private TextView mItemText; private ImageView mItemImage; private int positionNext; private Content2 content; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false); return new ListViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ListViewHolder) holder).bindView(position); } @Override public int getItemCount() { return moviesNames.size(); } private class ListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ public ListViewHolder(View itemView){ super (itemView); mItemText = (TextView) itemView.findViewById(R.id.textView); mItemImage = (ImageView) itemView.findViewById(R.id.card_background); itemView.setOnClickListener(this); } public void bindView(int position) { content = new Content2(); content.execute(); positionNext = position; } public void onClick(View view){ } } 

In theory, the data should be displayed as cards in RecyclerView, but in fact only the first element is displayed.

How can I display all items? Is there another way?

  • In my opinion, the logic of your Async Task should return two arrays, or an array of ViewModel records of the form - name + URL, onPostExecute should net it to the adapter, and disable the adapter. - Serge Markov

1 answer 1

To get rid of unnecessary lists, create a model Film.java:

 public class Film { String name; String urls; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Film film = (Film) o; return Objects.equals(name, film.name) && Objects.equals(urls, film.urls); } @Override public int hashCode() { return Objects.hash(name, urls); }} 

Let's tweak PopularAdapter.java:

 public class PopularAdapter extends RecyclerView.Adapter { private ArrayList<Film> movies = new ArrayList<>(); private TextView mItemText; private ImageView mItemImage; public void addList(ArrayList<Film> names) { movies.addAll(names); notifyDataSetChanged(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false); return new ListViewHolder(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ListViewHolder) holder).bindView(position); } @Override public int getItemCount() { return movies.size(); } private class ListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { ListViewHolder(View itemView) { super(itemView); mItemText = (TextView) itemView.findViewById(R.id.textView); mItemImage = (ImageView) itemView.findViewById(R.id.card_background); itemView.setOnClickListener(this); } void bindView(int position) { mItemText.setText(movies.get(position).name); Picasso.get().load(movies.get(position).urls).into(mItemImage); } public void onClick(View view) { } }} 

MainActivity:

 public class MainActivity extends AppCompatActivity { RecyclerView rv; PopularAdapter rvAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv = findViewById(R.id.rv); rvAdapter = new PopularAdapter(); rv.setLayoutManager(new LinearLayoutManager(this)); rv.setAdapter(rvAdapter); Content2 content = new Content2(); content.execute(); } class Content2 extends AsyncTask<Void, Void, ArrayList<Film>> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected ArrayList<Film> doInBackground(Void... params) { Document htmlTags = null; ArrayList<Film> list = new ArrayList<>(); try { String htmlUrl = "http://www.cinemaplus.az/ru"; htmlTags = Jsoup.connect(htmlUrl).get(); } catch (Exception e) { e.printStackTrace(); } Elements moviesContainer = htmlTags.getElementsByAttributeValueContaining("class", "sortable_movie_home"); for (Element movieContainer : moviesContainer) { Film item = new Film(); item.name = movieContainer.select("h2").text(); item.urls = "http://www.cinemaplus.az" + movieContainer.getElementsByAttributeValueContaining("src", "site/assets").attr("src"); list.add(item); } return list; } @Override protected void onPostExecute(ArrayList<Film> result) { super.onPostExecute(result); rvAdapter.addList(result); } }}