Цель: Конвертировать список Api объектов в roomDataBase объекты и присваивать RecyclerViewAdapter уже roomDataBase объектам. И все это делать , не в основном потоке с помощью RxJava.
Timber почему то не выводит в логи "DbArticle insert" в SportNewsFragment поэтому не понимаю вставились у меня объекты в DB или нет.
Вообщем, туплю 4ый день. Спасибо. Прилагаю SportNewsFragment , RecyclerViewAdapter, Converter, Api class - Article, DataBase classes
public class SportNewsFragment extends Fragment {
RecyclerView recyclerView;
RecyclerViewAdapter adapter;
Converter converter;
ArticleDao articleDao;
CompositeDisposable compositeDisposable = new CompositeDisposable();
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sportnews, container, false);
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new RecyclerViewAdapter();
recyclerView.setAdapter(adapter);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ApiClient apiClient = new ApiClient();
Timber.d("onViewCreated");
apiClient.getArticleList("us", "sports")
.map(sportNews -> sportNews.articles)
.map(articleList -> converter.convert(articleList))
.map(dbArticles -> articleDao.insert(dbArticles))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext (don->Timber.d("DbArticle inserted"));
????????????????????????????????????????????????????
}
@Override
public void onDestroy() {
super.onDestroy();
compositeDisposable.dispose();
}
}
// public void showError(String errorMessage) {
// Toast.makeText(getActivity(), errorMessage, Toast.LENGTH_LONG).show();
// Timber.d(errorMessage);
// }
// apiClient.getArticleList("us", "sports").enqueue(new Callback<SportNews>() {
// @Override
// public void onResponse(Call<SportNews> call, Response<SportNews> response) {
// if (response.isSuccessful()) {
// SportNews responseBody = response.body();
// if (responseBody != null) {
// List<Article> articlesFromApi = responseBody.articles;
//
//
// adapter.setArticleList(articlesFromApi);
// adapter.notifyDataSetChanged();
// } else {
// showError("responseBody == null ");
// }
// } else {
// showError("no Response " + response.code());
// }
// }
//
// @Override
// public void onFailure(Call<SportNews> call, Throwable t) {
// showError(t.getMessage());
// }
// });
// }
@Entity
public class DbArticle {
@PrimaryKey(autoGenerate = true)
public int id;
public String author;
public String title;
public String description;
public String url;
public String urlToImage;
public String publishedAt;
}
<!-- begin snippet: js hide: false console: true babel: false -->
@Database(version = 2, entities = {DbArticle.class}, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
abstract public ArticleDao articleDao();
}
public class Converter {
public static List<DbArticle> convert(List<Article> articleList) {
List<DbArticle> dbArticleList = new ArrayList<>();
for (Article article : articleList) {
DbArticle dbArticle = new DbArticle();
dbArticle.author = article.author;
dbArticle.description = article.description;
dbArticle.publishedAt = article.publishedAt;
dbArticle.title = article.title;
dbArticle.url = article.url;
dbArticle.urlToImage = article.urlToImage;
dbArticleList.add(dbArticle);
}
return dbArticleList;
}
}
public class Article {
@SerializedName("source")
public Source source;
@SerializedName("author")
public String author;
@SerializedName("title")
public String title;
@SerializedName("description")
public String description;
@SerializedName("url")
public String url;
@SerializedName("urlToImage")
public String urlToImage;
@SerializedName("publishedAt")
public String publishedAt;
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private List<Article> articleList = new ArrayList<>();
public void setArticleList(List<Article> articleList) {
this.articleList = articleList;
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView tvTitle, tvAuthor, tvDescription;
ViewHolder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
tvDescription = itemView.findViewById(R.id.tvDescription);
tvTitle = itemView.findViewById(R.id.tvTitle);
tvAuthor = itemView.findViewById(R.id.tvAuthor);
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Article article = articleList.get(position);
holder.tvDescription.setText(article.description);
holder.tvAuthor.setText(article.author);
holder.tvTitle.setText(article.title);
GlideApp
.with(holder.itemView.getContext())
.load(article.urlToImage)
.centerCrop()
.placeholder(R.drawable.ic_launcher_background)
.into(holder.imageView);
}
@Override
public int getItemCount() {
return articleList.size();
}
}
Пока формулировал вопрос , частично нашел ответ - в RecyclerViewAdapter я принимаю Api class Article , а нужно DbArticle , т.к. я уже сделал insert.
Но Timber в doOnNext все равно не выводит лог.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Когда тыкаю на Enter в EditText, выбирается "следующим" неправильное поле(
Загружаю в стартовой активности файл с сервера(~400КБ) Файл формата
Есть готовая кнопка, по которой открывается файловая система и выбирается файлСейчас хочу сделать чтобы можно было перенести с проводника...