I'm developing a news application. In this application, the user can store it's favorite news. The news is stored in SQLite database. When the user clicks on the recyclerView image, a custom dialog box appears including 3 buttons.
One button is for reading the storing using the browser. It will use the URL stored in SQLite to open the browser. The second button is for deletion. When the user clicks on the delete button the method is called and the data is deleted but it doesn't update the recyclerView data.
You need to reopen the fragment to update the recyclerView data. I could've used notifyDataChange but all this is happening in Adapter class. After fragments loads, it gets the data from SQLite and send this data to model class using setters. Then that object is added into the List of that Model and at the end sent to adapter class.
Fragment:
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);
}
Adapter Class:
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();
}
}
onClick
logic only handles deletion from DB, since in recycler view, each row has a position, you should remove the object from thelist
and thennotifyItemRemoved()
. Also, it's not the responsibility of an adapter class to delete data from DB. In the least terms, you should let the activity handle it, or better yet, follow some software design. – Taseer