Вывод текста в TextView в AsyncTask

191
25 сентября 2018, 06:30

Ниже представляю 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, однако на деле отображается только первый элемент.

Как я могу вывести все элементы? Есть ли другой способ?

Answer 1

Чтобы избавиться от лишних списков создадим модель 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);
    }
}}
READ ALSO
Выгрузка XML из Oracle c помощью java (spring)

Выгрузка XML из Oracle c помощью java (spring)

Собственно есть spring приложение которое вызывает функцию возвращающую xml в clob'еСамо взаимодействие с базой данных происходит через DAO (java классы...

158
JavaFX Notifications эффект во время отображения

JavaFX Notifications эффект во время отображения

Подскажите, возможно ли убрать эффект в время отображения уведомления?

182
netty java закрытие сервера из хендлера

netty java закрытие сервера из хендлера

Как мне в netty выключить сервер из хендлера?

140