Добрый день!
Если вы решили это читать - извините за неприятный код.
Проблема вот в чём : Всё вроде бы работает, только вот Picasso не отображает картинки. Сайт парсится, ссылки достаются, но не отображаются, причем очень странный момент: если в дебаге поставить стопы на куске кода с Picasso, то они отображаютсяа, а если просто запускать - нет.
public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
LinearLayoutManager verticalLinearLayoutManager;
RecyclerAdapter adapter;
public Elements title;
public ArrayList<String> titleList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NewThread nt = new NewThread();
nt.execute();
recyclerView = (RecyclerView) findViewById(R.id.recycler);
verticalLinearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(verticalLinearLayoutManager);
adapter = new RecyclerAdapter();
recyclerView.setAdapter(adapter);
adapter.addAll(titleList);
}
private class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder>{
ArrayList<String> linkList = new ArrayList<String>();
public void addAll(ArrayList<String> titleList) {
int pos = 0;
this.linkList.addAll(titleList);
notifyItemRangeInserted(pos, this.linkList.size());
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false);
return new RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
Picasso.with(MainActivity.this).load(linklist.get(position)).into(holder.image3);
}
@Override
public int getItemCount() {
return linkList.size();
}
}
private class RecyclerViewHolder extends RecyclerView.ViewHolder{
public ImageView image3;
public RecyclerViewHolder(View itemView) {
super(itemView);
image3 = (ImageView) itemView.findViewById(R.id.image2);
}
public void bind(String s) {
}
}
public class NewThread extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... arg) {
Document doc;
try {
doc = Jsoup.connect("https://habrahabr.ru/").get();
titleList.clear();
Elements link3 = doc.select("img[src$=.jpg]");
for(Element el:link3){
titleList.add(el.absUrl("src"));
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
}
}
}
Вы заполняете ваш список в другом потоке. Вызов recyclerView.setAdapter() происходит в момент, когда NewThread еще не выполнен.
@Override
protected void onPostExecute(String result) {
adapter.addAll(titleList);
adapter.notifyDataSetChanged();
}
onPostExecute будет вызван как только данные будут загружены, таким образом будут готовы к отображению. В дебаге у вас получалось, так как данные успевали загрузиться до присвоения адаптера.
NewThread nt = new NewThread();
nt.execute(); // выполняется в другом потоке, соответсвенно нельзя ждать что после этого вызова данные для отображения будут готовы
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть три метода, которые отличаются буквально в пару строчекМожно как-то избежать дублирования кода?
Есть ли в природе готовый плагин jquery для перетаскивания ячеек html ? чтоб в дальнейшем их можно было сохранить в базу новые значения позиций