Я разрабатываю новостное приложение. В этом приложении пользователь может хранить свои любимые новости. Новости хранятся в базе данных SQLite. Когда пользователь нажимает на изображение recyclerView, появляется настраиваемое диалоговое окно, включающее 3 кнопки.
Одна кнопка предназначена для чтения сохранения с помощью браузера. Он будет использовать URL-адрес, сохраненный в SQLite, чтобы открыть браузер. Вторая кнопка предназначена для удаления. Когда пользователь нажимает кнопку удаления, вызывается метод, и данные удаляются, но он не обновляет данные recyclerView.
Вам необходимо повторно открыть фрагмент, чтобы обновить данные recyclerView. Я мог бы использовать notifyDataChange, но все это происходит в классе адаптера. После загрузки фрагментов он получает данные из SQLite и отправляет эти данные в класс модели с помощью установщиков. Затем этот объект добавляется в Список этой Модели и в конце отправляется в класс адаптера.
Фрагмент:
private void getDataFromSQLite() {
SQLiteDatabase db = databaseHelper.getReadableDatabase();
String selectQuery = "SELECT * FROM " + DatabaseHelper.TABLE_NAME;
Cursor cursor = db.rawQuery(selectQuery,null);
if (cursor.moveToFirst()) {
do {
NewsModel newsModel = new NewsModel();
newsModel.setSourceName(cursor.getString(1));
newsModel.setAuthor(cursor.getString(2));
newsModel.setTitle(cursor.getString(3));
newsModel.setDescription(cursor.getString(4));
newsModel.setUrl(cursor.getString(5));
newsModel.setUrlToImage(cursor.getString(6));
newsModel.setPublishedAt(cursor.getString(7));
newsModelList.add(newsModel);
} while (cursor.moveToNext());
}
setRvadapter(newsModelList);
cursor.close();
}
public void setRvadapter (List<NewsModel> lst) {
myAdapter = new RvAdapterFavourite(getActivity(),lst) ;
myrv.setLayoutManager(new LinearLayoutManager(getActivity()));
myrv.setAdapter(myAdapter);
}
Класс адаптера:
public class RvAdapterFavourite extends RecyclerView.Adapter<RvAdapterFavourite.MyViewHolder> {
private RequestOptions options ;
private Context mContext ;
private List<NewsModel> mData ;
private DatabaseHelper databaseHelper;
public RvAdapterFavourite(Context mContext, List<NewsModel> list) {
this.mContext = mContext;
this.mData = list;
options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.ic_load)
.error(R.drawable.loading_shape);
databaseHelper = new DatabaseHelper(mContext);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater mInflater = LayoutInflater.from(mContext);
View view = mInflater.inflate(R.layout.news_item_row_favourite, parent, false);
// click listener here
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.tvAuthor.setText(String.format("Author: %s", mData.get(position).getAuthor()));
holder.tvSourceName.setText(String.format("Source: %s", mData.get(position).getSourceName()));
holder.tvPublishedAt.setText(String.format("Published At: %s", mData.get(position).getPublishedAt()));
holder.tvTitle.setText(mData.get(position).getTitle());
holder.tvDescription.setText(mData.get(position).getDescription());
//set listener on pic to read full story in browser
holder.newsThumbnail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showOptionsDialog(mData.get(holder.getAdapterPosition()).getUrl());
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tvAuthor,tvSourceName,tvPublishedAt,tvTitle,tvDescription;
ImageView newsThumbnail;
MyViewHolder(View itemView) {
super(itemView);
tvAuthor = itemView.findViewById(R.id.author);
tvSourceName = itemView.findViewById(R.id.sourceName);
tvPublishedAt = itemView.findViewById(R.id.publishedAt);
tvTitle = itemView.findViewById(R.id.newsTitle);
tvDescription = itemView.findViewById(R.id.newsDescription);
newsThumbnail = itemView.findViewById(R.id.NewsImage);
}
}
//show dialog box on click
@SuppressLint("SetTextI18n")
private void showOptionsDialog(final String linkToStory)
{
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseHelper.deleteFromData(linkToStory);
dialog.dismiss();
}
});
dialog.show();
}
}