Ниже представляю AsyncTask
, который находится в адаптере. В doInBackground()
выполняется парсинг с помощью Jsoup, далее в onPostExecute()
устанавливается текст в TextView.
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);
}
}
Адаптер, в котором находится AsyncTask
:
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){
}
}
По идее данные должны выводиться в виде карточек в RecyclerView, однако на деле отображается только первый элемент.
Как я могу вывести все элементы? Есть ли другой способ?
Чтобы избавиться от лишних списков создадим модель 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);
}}
Подправим 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);
}
}}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Собственно есть spring приложение которое вызывает функцию возвращающую xml в clob'еСамо взаимодействие с базой данных происходит через DAO (java классы...
Подскажите, возможно ли убрать эффект в время отображения уведомления?